相关疑难解决方法(0)

如何安全地混合同步和异步代码?

我有这个纯粹同步的库.它暴露了同步方法,我有客户端使用它.

对于想要使用它的人,我将底层实现更改为异步和公开的异步方法.但现在我有很多复制代码.异步代码似乎表现更好.我希望现有客户能够利用它,我想消除代码重复.

有没有安全的方法来保持同步签名和调用异步实现?

在打电话时我特别害怕死锁.Result和.Wait.

.net c# deadlock asynchronous async-await

18
推荐指数
1
解决办法
9353
查看次数

Task.WaitAll死锁

我有一个关于Task.WaitAll的问题.起初我尝试使用async/await来得到这样的东西:

private async Task ReadImagesAsync(string HTMLtag)
{
    await Task.Run(() =>
    {
        ReadImages(HTMLtag);
    });
}
Run Code Online (Sandbox Code Playgroud)

这个功能的内容无关紧要,它同步工作,完全独立于外界.

我这样使用它:

private void Execute()
{
    string tags = ConfigurationManager.AppSettings["HTMLTags"];

    var cursor = Mouse.OverrideCursor;
    Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
    List<Task> tasks = new List<Task>();
    foreach (string tag in tags.Split(';'))
    {
         tasks.Add(ReadImagesAsync(tag));
         //tasks.Add(Task.Run(() => ReadImages(tag)));
    }

    Task.WaitAll(tasks.ToArray());
    Mouse.OverrideCursor = cursor;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,Task.WaitAll如果我以这种方式使用它(使用async/await),我会遇到死锁.我的函数完成它们的工作(所以它们被正确执行),但Task.WaitAll只是永远停留在这里,因为显然ReadImagesAsync不会返回给调用者.

注释行是实际正常工作的方法.如果我对tasks.Add(ReadImagesAsync(tag));线路进行评论并使用tasks.Add(Task.Run(() => ReadImages(tag)));- 一切运作良好.

我在这里错过了什么?

ReadImages方法看起来像这样:

private void ReadImages (string HTMLtag)
{
    string section = HTMLtag.Split(':')[0];
    string tag = …
Run Code Online (Sandbox Code Playgroud)

c# wpf asynchronous async-await

4
推荐指数
1
解决办法
602
查看次数

标签 统计

async-await ×2

asynchronous ×2

c# ×2

.net ×1

deadlock ×1

wpf ×1