c#winform Facebooksdk Post与PostTaskAsync

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

我对facebooksdk很陌生,但我有一个c#中的winform项目,用它来执行简单的状态发布和照片上传

但是,到目前为止,SDK还不错,FacebookClient.Post和FacebookClient.PostTaskAync之间有什么区别

我使用以下代码将照片发布到我的facebook帐户:

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('
这意味着,一旦完成,结果将被封送回UI线程,并且UI将保持响应。 请参阅:


似乎我在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 });
        }
    }