gpt4 book ai didi

c# - 当我的任务从自定义 TaskScheduler 启动时,'await' 不返回

转载 作者:太空狗 更新时间:2023-10-29 21:50:12 27 4
gpt4 key购买 nike

背景:

我有一个“Messenger”类。它发送消息。但由于限制,假设它一次最多只能发送 5 条消息。

我有一个 WPF 应用程序,它根据需要对消息进行排队,并在继续之前等待处理排队的消息。由于应用程序的异步性质,任何数量的消息都可能是 await在任何给定时间编辑。

当前实现:

为此,我实现了一个 Task<Result> SendMessage(Message message)我的消息传递类中的 API。消息传递类的内部是一个自定义 TaskScheduler(LimitedConcurrencyTaskScheduler from MSDN),其并发级别设置为 5。这样,我希望无论有多少消息排队,一次只会发送 5 条,我的客户端应用程序将耐心等待,直到处理完相应的消息。

问题:

当我 await SendMessage方法,我可以通过调试器看到消息已完成并返回结果,但我的代码从未执行到 await 之外ed 方法调用!

await 时,是否有一些特殊的注意事项需要做出?正在使用不同的 TaskScheduler 安排任务?

代码片段:

来 self 的客户/消费功能:

public async Task Frobulate()
{
Message myMessage = new Message(x, y, z);
await messenger.SendMessage(myMessage);

//Code down here never executes!
}

来 self 的信使类:

private TaskScheduler _messengerTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
private TaskFactory _messengerTaskFactory = new TaskFactory(_messengerScheduler);

public Task<Result> SendMessage(Message message)
{
//My debugger has verified that "InternalSendMessage" has completed,
//but the caller's continuation appears to never execute
return _messengerTaskFactory.StartNew(() => InternalSendMessage(message));
}

更新:

“卡住”实际上并不是由我的习惯引起的 TaskScheduler ;当我排队 Task默认 TaskFactory ,同样的行为发生!一定是在更基本的层面上发生了其他事情,可能是由于我自己的愚蠢。

最佳答案

根据评论,您可能遇到了死锁,因为您阻塞了异步代码。

使用异步时,每当 SynchronizationContextTaskScheduler 上存在线程限制并且使用 Task.Result 的代码块时Task.Wait 有死锁的可能。异步操作需要一个线程来完成执行,它无法获得,因为 SynchronizationContext(或您的情况下的 TaskScheduler)正在等待相同的 在允许"new"运行之前完成操作。

深入阅读 Stephen Cleary 的博客文章:Don't Block on Async Code

关于c# - 当我的任务从自定义 TaskScheduler 启动时,'await' 不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com