0

私は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()」も試しましたが、うまくいきませんでした。

この問題を処理するための提案はありますか? この写真のアップロードを処理するために別のスレッドを使用しますか? または?

すべての回答とコメントをありがとう。

4

2 に答える 2

0

async / awaitを使ってみましたか?

明らかに、以下の非常に最小限の例ですが、注意してください。

  • メソッドは「async」でタグ付けされています
  • 戻りタイプはタスク(またはタスク<T>)です。
  • Facebookのメソッドは次のように変更されます:'await fb.PostTaskAsync('

これは、結果が完了するとUIスレッドにマーシャリングされて戻され、UIの応答性が維持されることを意味します。参照してください:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Load += OnLoad;
    }

    private const string AccessToken = "xxxxxxxxxxxxxx";
    private const string imgType = "image/jpeg";
    private const string fPath = "c:\bob.jpg";
    private const string userMsg = "My Message";

    private async void OnLoad(object sender, EventArgs e)
    {
        await DoSomething();
    }

    private async Task DoSomething()
    { 
        var fb = new FacebookClient(AccessToken);

        using (var file = new FacebookMediaStream
        {
            ContentType = imgType,
            FileName = Path.GetFileName(fPath)
        }.SetValue(File.OpenRead(fPath)))
        {
            dynamic result = await fb.PostTaskAsync("me/photos",
                new { message = userMsg, file });
        }
    }
}
于 2012-10-15T17:18:37.723 に答える
0

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 });
        }
    }

アドバイスありがとうございます。

于 2012-10-16T15:33:26.777 に答える