gpt4 book ai didi

c# - 等待任务返回 WaitingForActivation?

转载 作者:行者123 更新时间:2023-11-30 14:29:10 25 4
gpt4 key购买 nike

我有一个共享 BlockingCollection 的消费者/生产者设置。

public void StartConsumer(CancellationToken cancellationToken)
{
Task.Factory.StartNew(async () =>
{

foreach (var value in collection.GetConsumingEnumerable(cancellationToken))
{
var rowsAffected = await GetFooAsync(value.Id);
}

}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current)
.ContinueWith(task => HandleConsumerStopped(task, cancellationToken), cancellationToken);
}

从第一个线程返回到“ContinueWith”的任务始终是任务的结果。该任务的结果为“WaitingForActivation”,

所以,我的问题是,为什么它会从 foreach 循环中出来?在取消 cancellationToken 之前它不应该阻塞吗?

iner GetFooAsync 是否导致某些行为从 Foreach 中断??

最佳答案

您当前的代码将调用 HandleConsumerStopped一旦它击中第一个await ,因为那是您的异步​​方法返回给调用者的时候。请注意,您的 StartNew 正在返回 Task<Task>您需要为内部任务附加延续。目前,您的代码将其附加到外部任务。

如果要完成整个异步方法,只需调用 HandleConsumerStopped 即可。异步方法本身内部的方法。

Task.Factory.StartNew(async () =>
{
foreach (var value in collection.GetConsumingEnumerable(cancellationToken))
{
var rowsAffected = await GetFooAsync(value.Id);
}

HandleConsumerStopped();//Parameters removed
}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);

如果您只能使用 ContinueWith那么你需要使用 Task.Run或者您需要调用Unwrap .如果你使用 Task.Run你得到 UnWrap免费但没有TaskCreationOptions旗帜。

 Task.Factory.StartNew(async () =>
{
foreach (var value in collection.GetConsumingEnumerable(cancellationToken))
{
var rowsAffected = await GetFooAsync(value.Id);
}

}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current)
.UnWrap()//Note the unwrap here
.ContinueWith(task => HandleConsumerStopped(task, cancellationToken), cancellationToken);

现在HandleConsumerStopped将运行一次StartNew的全身完成,不在foreach中间.

关于c# - 等待任务返回 WaitingForActivation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27020794/

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