2009-03-10 31 views
1

POP3アカウントをチェックするクラスを作成しましたが、UIスレッド以外のスレッドで実行したいと思います。UIスレッドで同期メソッドを非同期で呼び出す

これを行うには、私は非同期ルートを選択しました。

pop3delegate.BeginInvoke(null、null)から結果を取得するには、EndInvokeを呼び出す必要がありますが、これをUIスレッドブロックで行い、UIを使用できなくする必要があります。

IAsyncResultオブジェクトを使用してIsCompleteプロパティをチェックすることができますが、これはループをチェックしてUIをロックします。

私が探しているのは、POP3クラスから完全な、またはある種のステータスを取得する方法です。これは、UIを更新し、UIを使用して他のタスクを実行できるようにします。また、ある時点でEndInvokeメソッドを呼び出して、ワーカースレッドでスローされた例外をキャッチする必要があります。

提案がありますか?

答えて

3

これは、あなたが必要とするものを正確に行うように設計されたBackgroundWorkerクラスを使用してみてください。

例とMSDNの詳細:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

+0

私は」 veは読んでいましたが、これはイベントベースの報告方法ですが、それについて考えるようになりました。私はpop3クラスにイベントを持ち、UIメソッドをフックして結果を表示することができました。 –

0

BackgroundWorkerを使用します。また、UIとバックグラウンドの間にデータをマーシャリングする手間を省き、進行状況の通知とキャンセルを可能にします。

0

使用イベントとスレッドプール

var asyncResult = pop3delegate.BeginInvoke(null,null); 
ThreadPool.RegisterWaitForSingleObject(
    asyncResult.WaitHandle, FunctionToCallWhenDone, null, TimeSpan.Infinite, true); 

データが到着したとき、これはあなたのFunctionToCallWhenDoneを呼び出します。また、独自のスレッドを作成するよりも安いはずのThreadPoolを使用しています。しかし、Kurt SchelfthoutがUIを変更するには、uielement.Invoke(>)=> {some code}のような何かをしなければならないと指摘しています。あなたがブロックまたはループする必要はありません

0

、あなたは、単にあなたのBeginInvokeメソッド呼び出しの最初のパラメータとしてコールバックメソッド(デリゲート)を渡すことができ、ここでは、EndInvokeをプロセスの例外を呼び出すことができるなど

private delegate int LongRunningTaskHandler(); 
static void Main(string[] args) { 
    LongRunningTaskHandler handler = LongRunningTask; 
    handler.BeginInvoke(MyCallBack, null); 
    Console.ReadLine(); 
} 
private static void MyCallBack(IAsyncResult ar) { 
    var result = (LongRunningTaskHandler)((AsyncResult) ar).AsyncDelegate; 
    Console.WriteLine(result.EndInvoke(ar)); 
} 
public static int LongRunningTask() 
{ 
    Thread.Sleep(5000); 
    return 42; 
} 
+0

コールバックメソッドでは、進行状況インジケータが表示されず、タスクが完了しただけです。私は定期的なチェックが必要です。 –

関連する問題