处理IAsyncOperationWithProgress最干净的方法?

时间:2012-10-22 20:33:41

标签: c# .net asynchronous windows-runtime async-await

我一直在使用C#已经有一段时间了,但不知何故还没有使用.Net 4中新的await/async新东西的乐趣。好吧,现在我正在创建一个链接的控制台应用程序到WinRT库和WinRT真的......好吧,异步。

我现在需要做的一件事就是安装一个包。所以,我使用PackageManager.AddPackageAsync这当然是异步的,并返回IAsyncOperationWithProgress

我知道我可以做类似

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

但是我很确定整个异步和等待事情都是针对这种情况而设计的。但是,我不明白如何在IAsyncOperationWithProgress

的上下文中使用它

3 个答案:

答案 0 :(得分:3)

.Net包含GetAwaiter()扩展方法,可使IAsyncOperationWithProgress等待。 您只需在await tmp;方法中编写async

您的async方法将返回Task(或Task<T>),您可以从另一个异步方法await返回,或致电Wait()同步阻止

答案 1 :(得分:2)

Async和Await允许您编写Async操作,就像它在调用线程上发生一样。首先,您必须将操作声明为异步,然后等待来自其他人的异步操作。最后,在完成该操作后,您将完成您想要做的任何工作。

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

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

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

答案 2 :(得分:2)

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

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