【问题标题】:Background worker has the wrong return type后台工作人员的返回类型错误
【发布时间】:2015-08-10 12:26:54
【问题描述】:

有以下代码:

private async Task backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    UserCredential credential;
    using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
    {
        credential = await GoogleWebAuthorizationBroker.AuthorizeAsync (
        GoogleClientSecrets.Load(stream).Secrets,
        new[] { YouTubeService.Scope.Youtube },
        "user",
        CancellationToken.None,
        new FileDataStore(this.GetType().ToString())
        );
    }

    var youtubeService = new YouTubeService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = this.GetType().ToString()
    });

    PlaylistsResource.ListRequest request = youtubeService.Playlists.List("snippet");
    request.Mine = true;
    PlayListResponse = request.Execute();

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("OK");
}

当我构建解决方案时,我得到:

'System.Threading.Tasks.Task YouTubeDesktopPlayer.Form1.backgroundWorker1_DoWork(object, System.ComponentModel.DoWorkEventArgs)' has the wrong return type

如何更改返回类型?我有点困惑,我不明白async TaskBackgroundWorker 是如何工作的

【问题讨论】:

  • 你需要它是 async void 才能与 DoWorkEventHandler 兼容。
  • 就是这样。它正在工作。
  • 如果您已经使用异步方法,那么使用 BackgroundWorker 就没有什么意义了。您可以在开始下载的事件(例如按钮单击)中简单地使用async void 语法。事实上,对于 async/await 和 TPL,一般来说使用 BackgroundWorker 没有什么意义

标签: c# async-await task backgroundworker


【解决方案1】:

不要使用async void DoWork 事件处理程序。它将在DoWork 完成之前触发RunWorkerCompleted,并且不会正确捕获异常。

如果您需要在后台线程上执行异步工作(这种情况很少见),请改用Task.Run。我有一个 blog series 详细说明,但要点是:

await Task.Run(() =>
{
  // DoWork code goes here
  UserCredential credential;
  ...
  PlayListResponse = request.Execute();
});

// RunWorkerCompleted code goes here
MessageBox.Show("OK");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多