9

次の方法を考えます。

public async Task<MyObject> DoSomethingAsync() {
    // do some work
    await OpenSomeFileAsync();
    return new MyObject();
}

違いはありますか:

public async void SomeEventHandler(EventArgs args) {
    var myObject = await await Task.Factory.StartNew<Task<MyObject>>( DoSomethingAsync);
    // do something with myObject
}

と:

public async void SomeEventHandler(EventArgs args) {
    var myObject = await DoSomethingAsync();
    // do something with myObject
}

最初のケースでは、DoSomethingAsync の「何らかの作業を行う」部分が新しいタスクですぐに発生するだろうと考えていましたが、正直なところ、Tasks、async、await がどのように機能しているかを完全には理解していません。確かに、私は自分自身のために物事を過度に複雑にしています。

編集:

この質問は、この Metro の例を見てから生じました: http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782

特に MainPage.xaml.cs では、次のようになります。

var unused = Task.Factory.StartNew(async () => { // some work... });
// unused is of type Task<TResult>

私は匿名の非同期関数を使用せずにそれを作り直そうとしていましたが、StartNew を呼び出して非同期関数を渡す代わりに、非同期メソッドを記述してそれを待機しないのはなぜでしょうか?

4

2 に答える 2

11

ほとんどの場合、別のものを追加しTaskても役に立ちませんが、場合によっては役に立ちます。

違いは、UI スレッド (または類似のもの) を使用してDoSomethingAsync()直接実行する場合、その最初の部分 ( // do some work) も UI スレッドで実行され、メソッドの継続部分も実行されます (使用しない限りConfigureAwait())。一方、別の を開始するTaskと、 の最初の部分と後続の部分の両方DoSomethingAsync()が で実行されますThreadPool

DoSomethingAsync()が正しく記述されている場合、別のものを追加してTaskも利点はありません (オーバーヘッドが増えるという欠点もあります) が、違いが生じる場合があると想像できます。

Task.Factory.StartNew()また、 and twoを使用する代わりにawait、次のように書くこともできます。

await Task.Run(DoSomethingAsync);
于 2012-07-18T00:05:21.573 に答える
4

はい、違いがあります。最初のフォームでは、余分なレベルのタスクがあり、まったく役に立ちません。

最初の形式は基本的にこれと同等です:

Task<Task<MyObject>> task1 = Task.Factory.StartNew<Task<MyObject>>( DoSomethingAsync);
Task<MyObject>> task2 = await task1;
var myObject = await task2;

したがって、実際には意味がありません。タスクを作成しているだけで、別のタスクが作成されます。

于 2012-07-17T22:58:52.020 に答える