0

我使用 C# 已经有一段时间了,但不知何故还没有享受到使用await/async.Net 4 中的全部新功能的乐趣。好吧,现在我正在制作一个链接到 WinRT 库的控制台应用程序,而 WinRT 真的..好吧,异步的。

我现在需要做的一件事是安装一个包。所以,我使用PackageManager.AddPackageAsyncThis is course is asynchonous 并返回一个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方法将返回一个Task(或Task<T>),您可以await从另一个异步方法或调用Wait()同步阻塞。

于 2012-10-22T20:35:29.693 回答
2

Async and Await 允许您对 Async 操作进行编程,就好像它发生在调用线程上一样。首先,您必须将您的操作声明为异步,然后等待其他人的异步操作。最后,您可以在该操作完成后执行您想做的任何工作。

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

调用 Foo 会使其在后台运行,但是当 AddPackageAsync 完成时,Foo 会重新加入调用线程(例如 UI 线程)以完成其工作。

另一种选择是调用 GetAwaiter 扩展方法并在其上调用 Wait() 以手动阻止,直到操作完成。

于 2012-10-22T20:50:32.313 回答
2

您可以通过使用 AsTask 方法的重载来订阅该进度,如下所示

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

于 2012-10-23T09:04:05.670 回答