0
public class SyncHelper
{
    private LiveConnectClient client;
    public event EventHandler SyncStarted;
    public event EventHandler SyncCompleted;

    public SyncHelper(LiveConnectClient client)
    {
        this.client = client;
    }

    public void TrySync()
    {
        Debug.WriteLine("Beginning sync");
        OnSyncStarted();
        client.GetCompleted += OnGetCompleted;
        client.GetAsync("me/skydrive/files");
    }

    private void OnGetCompleted(object sender, LiveOperationCompletedEventArgs e)
    {
        Thread.Sleep(10000);
        Debug.WriteLine("Get Completed");
        client.GetCompleted -= OnGetCompleted;
        OnSyncCompleted();
        Debug.WriteLine("Sync completed");
    }

    private void OnSyncStarted()
    {
        if (SyncStarted != null)
            SyncStarted(this, new EventArgs());
    }

    private void OnSyncCompleted()
    {
        if (SyncCompleted != null)
            SyncCompleted(this, new EventArgs());
    }
}

関数OnGetCompletedがUIスレッドで呼び出されており、UIが応答していません。私が知っていることから、これらのコールバックは別のスレッドで機能し、ディスプラッチャーを使用してUIスレッドに投稿する必要があると思いました。何かご意見は?ヘルプ!

4

1 に答える 1

1

呼び出しはGetAsyncバックグラウンドスレッドを使用して実際のフェッチを実行する可能性がありますが、元のスレッドコンテキストでCompletedコールバックを呼び出すことで支援しようとしているため、ディスパッチャーを使用する必要はありません。

とにかくなぜSleep(10000)を入れているのですか?コールバックは「ねえ、私は終わった」と言います。その時点で、必要に応じてUIを更新する必要があります。かなりの時間がかかるさらなる処理を行う必要がある場合は、バックグラウンドスレッド、スレッドプールタスクを生成するか、別のコールバックで別の非同期呼び出しを使用します。

于 2012-05-06T14:14:30.773 に答える