c# – Await停止执行线程,永远不会继续

我有以下内容
public async Task<bool> SearchForUpdatesAsync()
{
    return await TaskEx.Run(() =>
    {
    if (!ConnectionChecker.IsConnectionAvailable())
        return false;

    // Check for SSL and ignore it
    ServicePointManager.ServerCertificateValidationCallback += delegate { return (true); };

    var configurations = UpdateConfiguration.Download(UpdateConfigurationFileUri,Proxy);
    var result = new UpdateResult(configurations,CurrentVersion,IncludeAlpha,IncludeBeta);

    if (!result.UpdatesFound)
        return false;

    _updateConfigurations = result.NewestConfigurations;
    double updatePackageSize = 0;
    foreach (var updateConfiguration in _updateConfigurations)
    {
        var newPackageSize = GetUpdatePackageSize(updateConfiguration.UpdatePackageUri);
        if (newPackageSize == null)
            throw new SizeCalculationException(_lp.PackageSizeCalculationExceptionText);

        updatePackageSize += newPackageSize.Value;
        _packageOperations.Add(new UpdateVersion(updateConfiguration.LiteralVersion),updateConfiguration.Operations);
    }

    TotalSize = updatePackageSize;
    return true;
});
}

正如您所看到的,我正在使用Microsoft.Bcl.
现在在我的另一个类中,我在正常的void中编写了这段代码

TaskEx.Run(async delegate
{
    // ...
    _updateAvailable = await _updateManager.SearchForUpdatesAsync();
     MessageBox.Show("Test");
});

我遇到的问题是它执行_updateAvailable = await _updateManager.SearchForUpdatesAsync();然后它不会继续该线程,它只是停止,好像在该调用之后没有任何内容. Visual Studio也会在一段时间后告诉我:Thread …退出代码259,所以似乎还有一些东西还活着.

我通过它调试来搜索可能被吞下的任何异常,但没有,一切正常并且它执行return语句.
这就是我不明白的地方,我从未看到MessageBox和/或没有代码超出此行的执行.
在我和一些朋友交谈后,他们确认不应该这样做.在实现async-await时我犯了一个可怕的错误吗?

在此先感谢,这实际上我只能说,我没有更多的信息,我尽可能地感谢任何提示和帮助.

解决方法

您遇到的主要问题是您在TaskEx.Run()中不必要地包装您的方法,并且您可能正在某处遇到死锁.

您的方法签名目前是:

public async Task<bool> SearchForUpdatesAsync()

这意味着以下内容

async –> Doesn’t actually do anything,but provides a “heads up” that await might be called within this method and that this method can be used as a runnable Task.
Task –> This method returns a runnable task that can be run asynchronously on the threadpool
<bool> –> This method actually returns bool when awaited.

等待TaskEx.Run()是不必要的,因为这说运行此方法,然后在值可用之后才返回.这很可能导致同步问题.删除此构造将使您的方法正常工作,但是您会注意到现在您没有理由甚至包括异步运算符或任务< T>部分因为该方法实际上是同步的.通常,如果您要调用等待它们的方法,那么您将只在方法签名上使用异步标识符.

相反,你有两个选择.

>每当您想要调用SearchForUpdates()时,您可以将其包装在Task< bool> .Run()中以异步方式运行它(或者等效的Bcl)
>由于您使用的是WinForms,因此最好使用BackgroundWorker并在其中调用方法.

关于使用async-await模式,我认为这是一篇很好的文章,用于确保您遵循最佳实践:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么