Windows フォームで非同期呼び出しを試したことはありません。aynch/await
最近の Visual Studio/.NET を所有していないため、新しいものを使用できません。私が必要としているのは、「長い時間を要求する操作を実行する (IList を作成する)」ことであり、それが終了したら、そのリストの結果を TextBox に書き込みます。
インターネットで検索すると、うまくいくように見えるこの例が見つかりましたが、私の意見ではあまりにも準拠しています(おそらく、速くて簡単なものがあるかもしれません):
private void button1_Click(object sender, EventArgs e)
{
MyTaskAsync();
}
private void MyTaskWorker()
{
// here I populate the list. I emulate this with a sleep of 3 seconds
Thread.Sleep(3000);
}
private delegate void MyTaskWorkerDelegate();
public void MyTaskAsync()
{
MyTaskWorkerDelegate worker = new MyTaskWorkerDelegate(MyTaskWorker);
AsyncCallback completedCallback = new AsyncCallback(MyTaskCompletedCallback);
AsyncOperation async = AsyncOperationManager.CreateOperation(null);
worker.BeginInvoke(completedCallback, async);
}
private void MyTaskCompletedCallback(IAsyncResult ar)
{
MyTaskWorkerDelegate worker = (MyTaskWorkerDelegate)((AsyncResult)ar).AsyncDelegate;
AsyncOperation async = (AsyncOperation)ar.AsyncState;
worker.EndInvoke(ar);
AsyncCompletedEventArgs completedArgs = new AsyncCompletedEventArgs(null, false, null);
async.PostOperationCompleted(delegate(object e) { OnMyTaskCompleted((AsyncCompletedEventArgs)e); }, completedArgs);
}
public event AsyncCompletedEventHandler MyTaskCompleted;
protected virtual void OnMyTaskCompleted(AsyncCompletedEventArgs e)
{
if (MyTaskCompleted != null)
MyTaskCompleted(this, e);
// here I'll populate the textbox
textBox1.Text = "... content of the Iteration on the List...";
}
この簡単な操作には、本当に 50 行のコードが必要ですか? または、いくつかのものを削除できますか?完了したら、単純な非同期呼び出し->コールバックが必要です。
ロックなし、並行性なし...