0

私はかなり長い間 C# を使用してきましたが、どういうわけかawait/async、.Net 4 のすべての新機能を使用する喜びがまだありませんでした。今、私は WinRT ライブラリにリンクするコンソール アプリケーションを作成しています。 ..まあ、非同期です。

私が今しなければならないことの 1 つは、パッケージをインストールすることです。だから、私は使用しますPackageManager.AddPackageAsyncこれはもちろん非同期であり、IAsyncOperationWithProgress

私は次のようなことができることを知っています

bool Done=false;
void Foo()
{
    var tmp=new PackageManager.AddPackageAsync(...);
    tmp.Completed= ... FooBar;
    while(!Done){}
}
void FooBar(...)
{
    Done=true;
}

しかし、async と await 全体がまさにこのシナリオのために設計されていると確信しています。ただし、このコンテキストでの使用方法がわかりませんIAsyncOperationWithProgress

4

3 に答える 3

3

.Net には、待機可能にするGetAwaiter()拡張メソッドが含まれていIAsyncOperationWithProgressます。メソッドawait tmp;で書くだけです。async

メソッドは(または)asyncを返します。これは、別の非同期メソッドから取得するか、同期的にブロックするために呼び出すことができます。TaskTask<T>awaitWait()

于 2012-10-22T20:35:29.693 に答える
2

次のように、AsTaskメソッドのオーバーロードを使用して、その進行状況をサブスクライブできます。

...= await new PackageManager().AddPackageAsync(...).AsTask(new Progress<DeploymentProgress>(...));

于 2012-10-23T09:04:05.670 に答える
2

Async と Await を使用すると、呼び出し元のスレッドで発生するかのように Async 操作をプログラムできます。まず、操作が非同期であることを宣言する必要があります。次に、他の人からの非同期操作を待ちます。最後に、その操作が完了した後、実行したい作業を行います。

async void Foo()
{
  var tmp=await new PackageManager().AddPackageAsync(...);
  //do something else;
}

Foo を呼び出すとバック​​グラウンドで実行されますが、AddPackageAsync が完了すると、Foo は呼び出し元のスレッド (UI スレッドなど) に再び参加して作業を完了します。

もう 1 つのオプションは、GetAwaiter 拡張メソッドを呼び出して Wait() を呼び出し、操作が完了するまで手動でブロックすることです。

于 2012-10-22T20:50:32.313 に答える