等待停止执行线程,永远不会继续

多米尼克B.

我有以下内容:

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 ... exited with code 259似乎还活着。

我调试通过它来搜索可能被吞下的任何异常,但是没有任何事情,一切正常,并且执行return -statement。这就是我不了解的地方,我从没看到MessageBox和/或没有代码超出执行范围。在我与一些朋友交谈后,他们确认不应该这样。实施异步等待时,我是否犯了一个可怕的错误?

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

珍妮·朗格

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

您的方法签名当前为:

public async Task<bool> SearchForUpdatesAsync()

这意味着:

async->实际上不执行任何操作,但是提供了await可以在此方法中调用的“提示”,并且该方法可用作可运行的Task。
Task->此方法返回可在线程池上异步运行的可运行任务
<bool>->此方法实际上在等待时返回bool。

await TaskEx.Run()是不必要的,因为这表示,运行该方法,然后不返回,直到之后的值是可用的。这很可能导致同步问题。删除此构造将使您的方法正常工作,但是您会注意到,由于该方法实际上实际上是同步的,因此您现在甚至没有理由甚至包括async运算符或该Task<T>部分。通常,只有在async要调用方法时,才在方法签名上使用标识符await

相反,您有两个选择。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

中断的线程仍继续执行

来自分类Dev

Return语句将永远不会执行警告

来自分类Dev

让JavaFX等待并继续执行代码

来自分类Dev

RelayCommand可以执行,永远不会重新评估

来自分类Dev

等待cftool关闭,然后继续执行

来自分类Dev

为什么等待线程不会永远等待

来自分类Dev

从另一个线程调用时,WCF Duplex回调方法永远不会执行

来自分类Dev

如何处理永远不会执行的代码

来自分类Dev

等待Promise.all继续执行

来自分类Dev

有没有办法等待将来完成而不会阻塞Act Framework中的执行线程?

来自分类Dev

永远不会执行getInitialProps

来自分类Dev

程序在C ++中运行而不会永远停止

来自分类Dev

如何创建线程,等待它执行特定操作,然后继续?

来自分类Dev

Flink接收器永远不会执行

来自分类Dev

process.WaitForExit()永远不会获得退出信号。不继续执行程序

来自分类Dev

线程会停止执行并继续吗?只是令人困惑

来自分类Dev

foreach循环不会继续执行

来自分类Dev

永远不会删除缓存线程池中的线程

来自分类Dev

Silverlight永远不会在WP 8.1的UI线程通过分派器上执行代码

来自分类Dev

在Android中如何让执行线程等待,但UI线程继续

来自分类Dev

While循环停止,但不会继续执行下一条语句

来自分类Dev

睡眠永远不会继续执行

来自分类Dev

为什么await停止执行线程,结果在C#中等待激活?

来自分类Dev

“if”语句,永远不会执行条件

来自分类Dev

代码永远不会执行错误

来自分类Dev

多线程活动等待永远循环

来自分类Dev

等待一个线程的 Future 时,线程会继续执行吗

来自分类Dev

一些线程在大量调用时永远不会执行

来自分类Dev

如何停止线程的执行

Related 相关文章

热门标签

归档