- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个共享 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/
我试图找出 async 和 await 关键字的全部内容,但是输出不是我所期望的。 控制台应用如下: class Program { static void Main(string[] arg
我有一个共享 BlockingCollection 的消费者/生产者设置。 public void StartConsumer(CancellationToken cancellationToken)
我有以下功能: async public Task checkNetwork (RestClient _client, ConnectivityManager conn) {
我发现 async 方法有一个非常令人困惑的行为。考虑以下控制台应用程序: private static int _i = 0; private static Task _calculateTask
我试图找出 async 和 await 关键字的全部内容,但是输出不是我所期望的。 控制台应用如下: class Program { static void Main(string[] arg
public void DoStuff() { // I want to be able to call the method DoAsynckStuff and wait for the r
我只有一种 Api Request 方法如下 private async Task getSiteAsync(string siteId) { Site site = null; va
我正在尝试在 VS2012 框架 4.5 的表单上使用异步和等待命令。我的异步方法 SlowMethodAsync 不返回任何内容。请注意,此代码在控制台应用程序中运行良好。 private void
我正在用下面的方式启动 wpf 任务 var newTask = Task.Factory.StartNew(() => { fcStartSubPageCrawl(srMainSiteURL, sr
我正在使用 TaskFactory 使用以下代码启动新任务。 var task = Task.Factory.StartNew(async () => { await Task.Run(()
我已经下载了 EF6 (为了使用 async) 所以我写了这个简单的方法: public async Task> MyasyncMethod() { var loc
我正在尝试发送 url 请求并异步获取响应,但是当我将 .fromAsync 方法与 .ContinueWith 方法一起使用时,任务状态永远不会从 WaitingForActivation 更改为运
我是 HttpClient 的新手。我下面的代码总是在状态中显示“WaitingForActivation”。请帮忙 private static async Task MakeCall() {
我是 C# 中的任务的新手。我正在尝试按照有关将 arm 模板部署到 azure 以启动虚拟机的示例进行操作: https://azure.microsoft.com/en-us/documentat
给定以下代码: Dim t As Date = Now Dim e As New AsynchronousExecutionEventArgs
我是 AWS 的新手,正在尝试设置我的系统以在预订后向最终用户发送 SMS 作为确认消息。 到目前为止,我在下面做了: AmazonSimpleNotificationServiceClient sm
我正在尝试使用 Azure 中的托管身份连接到我的 Key Vault。为此,我在 appsettings.json 的 KeyVault 下的 Vault 下添加了一个带有 Key Vault 名称
我是一名优秀的程序员,十分优秀!