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

多米尼克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

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

永远不会执行getInitialProps

来自分类Dev

中断的线程仍继续执行

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

让JavaFX等待并继续执行代码

来自分类Dev

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

来自分类Dev

代码永远不会执行错误

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

多线程活动等待永远循环

来自分类Dev

foreach循环不会继续执行

来自分类Dev

如何停止线程的执行

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

等待Promise.all继续执行

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Flink接收器永远不会执行

Related 相关文章

热门标签

归档