217

私は何かが欠けているかもしれませんが、行うことの違いは何ですか:

public void MyMethod()
{
  Task t = Task.Factory.StartNew(DoSomethingThatTakesTime);
  t.Wait();
  UpdateLabelToSayItsComplete();
}

public async void MyMethod()
{
  var result = Task.Factory.StartNew(DoSomethingThatTakesTime);
  await result;
  UpdateLabelToSayItsComplete();
}

private void DoSomethingThatTakesTime()
{
  Thread.Sleep(10000);
}
4

6 に答える 6

413

私は何かが欠けているかもしれません

あなたは。

Task.Waitするとする はどう違いawait taskますか?

レストランのウェイターにランチを注文します。注文してからしばらくすると、友人が入ってきてあなたの隣に座り、会話を始めます。2 つの選択肢があります。タスクが完了するまで友達を無視できます。スープが届くまで待って、待っている間は何もしないでください。または、友達に応答することもできます。友達が話すのをやめると、ウェイターがスープを持ってきてくれます。

Task.Waitタスクが完了するまでブロックします。タスクが完了するまで友達を無視します。awaitメッセージキューでメッセージを処理し続け、タスクが完了すると、「待ってから中断したところから再開してください」というメッセージをキューに入れます。友達と話し、会話が途切れるとスープが到着します。

于 2012-03-01T16:04:22.660 に答える
124

ここでエリックの答えを示すために、いくつかのコードがあります。

public void ButtonClick(object sender, EventArgs e)
{
  Task t = new Task.Factory.StartNew(DoSomethingThatTakesTime);
  t.Wait();  
  //If you press Button2 now you won't see anything in the console 
  //until this task is complete and then the label will be updated!
  UpdateLabelToSayItsComplete();
}

public async void ButtonClick(object sender, EventArgs e)
{
  var result = Task.Factory.StartNew(DoSomethingThatTakesTime);
  await result;
  //If you press Button2 now you will see stuff in the console and 
  //when the long method returns it will update the label!
  UpdateLabelToSayItsComplete();
}

public void Button_2_Click(object sender, EventArgs e)
{
  Console.WriteLine("Button 2 Clicked");
}

private void DoSomethingThatTakesTime()
{
  Thread.Sleep(10000);
}
于 2012-03-01T16:30:03.493 に答える
10

この例では、ほとんどありません。別のスレッド (WCF 呼び出しなど) で戻るか、オペレーティング システムへの制御を放棄する Task (ファイル IO など) を待機している場合、await はスレッドをブロックしないことでシステム リソースの使用量を減らします。

于 2012-03-01T16:04:30.457 に答える