c#winform Facebooksdk Post与PostTaskAsync
我对facebooksdk很陌生,但我有一个c#中的winform项目,用它来执行简单的状态发布和照片上传 但是,到目前为止,SDK还不错,FacebookClient.Post和FacebookClient.PostTaskAync之间有什么区别 我使用以下代码将照片发布到我的facebook帐户:c#winform Facebooksdk Post与PostTaskAsync,c#,facebook,winforms,C#,Facebook,Winforms,我对facebooksdk很陌生,但我有一个c#中的winform项目,用它来执行简单的状态发布和照片上传 但是,到目前为止,SDK还不错,FacebookClient.Post和FacebookClient.PostTaskAync之间有什么区别 我使用以下代码将照片发布到我的facebook帐户: public static void uploadPhoto(string fPath, string userMsg, string imgType = "") { var fb = n
public static void uploadPhoto(string fPath, string userMsg, string imgType = "")
{
var fb = new FacebookClient(AccessToken);
if (imgType.Equals(""))
imgType = "image/jpeg";
using (var file = new FacebookMediaStream
{
ContentType = imgType,
FileName = Path.GetFileName(fPath)
}.SetValue(File.OpenRead(fPath)))
{
dynamic result = fb.Post("me/photos",
new { message = userMsg, file });
}
}
但是,当文件大小很大时,上述方法将“挂起”我的系统,因为主线程仍在工作,所以我尝试了以下方法:
dynamic result = fb.PostTaskAsync("me/photos",
new { message = userMsg, file });
但它就是不起作用(至少照片没有上传到我的fb帐户上)
实际上,我想要的是避免系统上出现“挂起”的感觉,我甚至尝试过“Application.DoEvents()”,但没有成功
有什么建议来处理这个问题吗?
我应该用另一个线程来处理这个照片上传吗?
还是
谢谢您的回答和评论。您是否尝试过使用async/await 下面显然是一个很小的例子,但请注意:
- 该方法标记为“async”
- 返回类型为Task(或Task
) - facebook方法更改为:“wait fb.PostTaskAsync('
似乎我在VS2010.net4.0上使用System.Threading.Tasks成功地处理了它,具体如下:
// For Tasks
private static Task _taskUpload = null;
private static string _fPath = "";
private static string _userMsg = "";
private static string _imgType = "";
/// <summary>
/// used to post photo to facebook
/// </summary>
/// <param name="fPath"></param>
/// <param name="userMsg"></param>
/// <param name="imgType"></param>
public static void uploadPhoto(string filePath, string userMsg, string imgType = "")
{
// Assign Values
_fPath = filePath;
_userMsg = userMsg;
_imgType = imgType;
// Start Task
_taskUpload = Task.Factory.StartNew(new Action(processUploadPhoto));
}
/// <summary>
/// Used to process actual upload of photo to FB
/// </summary>
private static void processUploadPhoto()
{
var fb = new FacebookClient(AccessToken);
if (_imgType.Equals(""))
_imgType = "image/jpeg";
using (var file = new FacebookMediaStream
{
ContentType = _imgType,
FileName = Path.GetFileName(_fPath)
}.SetValue(File.OpenRead(_fPath)))
{
dynamic result = fb.Post("me/photos",
new { message = _userMsg, file });
}
}
//用于任务
私有静态任务_taskUpload=null;
私有静态字符串_fPath=“”;
私有静态字符串_userMsg=“”;
私有静态字符串_imgType=“”;
///
///用于将照片发布到facebook
///
///
///
///
publicstaticvoiduploadphoto(字符串filePath,字符串userMsg,字符串imgType=“”)
{
//赋值
_fPath=文件路径;
_userMsg=userMsg;
_imgType=imgType;
//启动任务
_taskUpload=Task.Factory.StartNew(新操作(processUploadPhoto));
}
///
///用于处理照片到FB的实际上传
///
私有静态void processUploadPhoto()
{
var fb=新的FacebookClient(AccessToken);
if(_imgType.Equals(“”)
_imgType=“图像/jpeg”;
使用(var file=newfacebookmediastream)
{
ContentType=\u imgType,
FileName=Path.GetFileName(\u fPath)
}.SetValue(File.OpenRead(_fPath)))
{
动态结果=fb.Post(“我/照片”,
新的{message=_userMsg,file});
}
}
感谢您的建议。上面的“dynamic result=fb.PostTaskAsync”应该是“dynamic result=await fb.PostTaskAsync”,因为PostTaskAsync的返回值是一个任务,而不是返回对象。添加await将异步生成返回对象。亲爱的Jon,请阅读我下面关于VS2010 SP1、.net 4.0上await/async的评论.thanksNote这些关键字仅在最近发布的.NET版本中可用。如果您使用的是较旧版本,则需要在方法显式返回的
任务
上使用一个延续。亲爱的Jon,我看到了wait&async方法,但在VS2010 SP1.NET 4.0中找不到任何支持wait/async的库。有吗想法?嗨,Servy,我试图使用Task来处理这个案例,但是我需要注意任务状态吗?问这个问题是因为我在我的singleton类中使用了任务。调用这个时我需要一次创建一个新任务吗?请建议。谢谢。另外,请看一下:您可以在此处下载VS 2010异步CTP:是的-Task.Factory.StartNew将在线程池上启动新的异步后台操作。请注意,如果需要从此后台工作任务更新UI,则需要将UI控件更新发回UI线程。
// For Tasks
private static Task _taskUpload = null;
private static string _fPath = "";
private static string _userMsg = "";
private static string _imgType = "";
/// <summary>
/// used to post photo to facebook
/// </summary>
/// <param name="fPath"></param>
/// <param name="userMsg"></param>
/// <param name="imgType"></param>
public static void uploadPhoto(string filePath, string userMsg, string imgType = "")
{
// Assign Values
_fPath = filePath;
_userMsg = userMsg;
_imgType = imgType;
// Start Task
_taskUpload = Task.Factory.StartNew(new Action(processUploadPhoto));
}
/// <summary>
/// Used to process actual upload of photo to FB
/// </summary>
private static void processUploadPhoto()
{
var fb = new FacebookClient(AccessToken);
if (_imgType.Equals(""))
_imgType = "image/jpeg";
using (var file = new FacebookMediaStream
{
ContentType = _imgType,
FileName = Path.GetFileName(_fPath)
}.SetValue(File.OpenRead(_fPath)))
{
dynamic result = fb.Post("me/photos",
new { message = _userMsg, file });
}
}