0

長時間実行される非同期タスクでWPFを使用してASP.NETアプリケーションを構築していますが、場合によっては、ユーザーに詳細情報を要求する必要があります。タスクを中断することはできますが、キャンセルすることはできず、ユーザーが応答するのを待って、結果に基づいて続行する方法はありますか?

私が見つけたのは、タスクの前後にコールバックを使用する方法だけです。Send()メインスレッドから渡されたSynchronizationContextを介してUIスレッドメソッドを呼び出そうとしましたが、(場合によっては) Null参照例外がスローされます。

具体的には、このコードがSend()を呼び出すときにNullReferenceExceptionをスローする理由を理解できません。

protected void Page_Load(object sender, EventArgs e)
{
    Task task = new Task(DoSomeWork, new Tuple<SynchronizationContext, object>(SynchronizationContext.Current, new object()));
    task.Start();
}

public void DoSomeWork(object state)
{
    Tuple<SynchronizationContext, object> cst = (Tuple<SynchronizationContext, object>)state;
    cst.Item1.Send(Writer, "Message");
}

public void Writer(object s)
{
    Label1.Text = (s as string);
}
4

1 に答える 1

0

ランタイムで利用できるようになったAsyncとAwaitのものを見てください。

ここで賢明なデモを作成するには少し多すぎますが、次の点を指摘できます。

http://msdn.microsoft.com/en-gb/library/vstudio/hh191443.aspx

これで始められるはずです。

アップデート

ここに役立つかもしれないいくつかのリンクがあります。

http://code.jonwagner.com/2012/09/06/best-practices-for-c-asyncawait/

http://www.itwriting.com/blog/4913-a-simple-example-of-async-and-await-in-c-5.html

http://weblogs.asp.net/dixin/archive/2012/11/02/understanding-c-async-await-1-compilation.aspx

注:新しいC#5非同期のものにはたくさんのものがありますが、よく見ると、C#4非同期のものもたくさんありますが、それはC#5が脚光を浴びているということだけです。その瞬間、あなたは少しだけ物事をふるいにかける必要があるかもしれません。

于 2013-01-26T14:05:55.773 に答える