【问题标题】:Task type in a IBackgroundTask classIBackgroundTask 类中的任务类型
【发布时间】:2015-02-13 22:55:39
【问题描述】:

我想做

async Task DoSomething()
{
   await SomeAsyncAPI();
}

async void Run()
{
   await DoSomething();
   DoAnother();
}

但是 IBackgroundTask 类中不允许有任务类型。我希望 DoAnother() 在 DoSomething 完成后运行。

【问题讨论】:

  • 你目前的做法有什么问题?
  • 这是错误,因为 IBackgroundTask 类中不允许任务类型
  • 类中不允许,继承自IBackgroundTask

标签: c# .net windows-runtime task-parallel-library async-await


【解决方案1】:

您可以使用可等待的IAsyncActionWindowsRuntimeSystemExtensions.AsAsyncAction

public IAsyncAction DoWorkAction()
{
    return DoWorkAsync().AsAsyncAction();
}

internal async Task DoWorkAsync()
{
    await Task.Delay(100);
}

public async void Run(IBackgroundTaskInstance taskInstance)
{
   var deferral = taskInstance.GetDeferral();
   try
   {
      await DoWorkAction();
      DoAnother();
   }
   finally
   {
      deferral.Complete();
   }
}

对于Task<T>,使用IAsyncOperation<T>

public IAsyncOperation<string> DoMoreWorkAction()
{
    return DoMoreWorkAsync().AsAsyncOperation();
}

internal async Task<string> DoMoreWorkAsync()
{
    await Task.Delay(1000);
    return "Hello";
}

public async void Run(IBackgroundTaskInstance taskInstance)
{
   var deferral = taskInstance.GetDeferral();
   try
   {
      await DoMoreWorkAction();
      DoAnother();
   }
   finally
   {
      deferral.Complete();
   }
}

【讨论】:

  • 你的意思是taskInstance.GetDeferral
  • @DanielKelley 是的,修正了我的答案。
  • 请提出另一个问题。如果DoWorkAsyncTask&lt;T&gt;怎么办
  • IAsyncOperation 是不允许的 :(
【解决方案2】:

要对 WinRT 命令式事件(包括IBackgroundTask.Run)使用异步方法,您需要使用延迟:

async void Run(IBackgroundTaskInstance instance)
{
  var deferral = instance.GetDeferral();
  try
  {
    await DoSomething();
    DoAnother();
  }
  finally
  {
    deferral.Complete();
  }
}

【讨论】:

  • async Task DoSomething() 处出错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2016-12-06
  • 1970-01-01
  • 2017-10-15
  • 2015-06-28
相关资源
最近更新 更多