【发布时间】:2014-10-30 20:20:32
【问题描述】:
背景信息:我正在尝试创建一个能够同时处理 5 个并发操作的单例类。每个操作都由SomeAsyncMethod 表示。
此方法存在于单例类中。
consumers 是ConcurrentDictionary<int,Task>
我的问题:由于某种原因,ContinueWith 委托在SomeAsyncMethod 完成之前运行。我知道发生这种情况的原因是因为我有另一种方法可以监视instance.Consumers.Count - 在SomeAsyncMethod 完成之前计数是0。
为什么会这样?
public bool TryAddDequeueRequest()
{
if (instance.Consumers.Count < 5)
{
Task bogusTask;
Task newTask = new Task(SomeAsyncMethod);
//RUNS AFTER THE REQUEST IS COMPLETED
newTask.ContinueWith(t =>
{
instance.Consumers.TryRemove(t.Id, out bogusTask);
});
//WE ADD THE TASK TO QUEUE
instance.Consumers.TryAdd(newTask.Id, newTask);
//SET IT AND FORGET IT
newTask.Start();
return true;
}
else
return false;
}
【问题讨论】:
-
你怎么知道它还没有完成?
-
添加了该详细信息。 (我知道发生这种情况的原因是因为我有另一个方法可以监视 instance.Consumers.Count - 在 SomeAsyncMethod 完成之前计数为 0。)
-
SomeAsyncMethod调用一些服务并更新数据库。全部通过async和await操作完成。 -
您应该避免让多个线程分别访问共享内存。 TPL 的整个想法是通过允许任务使用其结果在线程之间传递信息来避免需要这样做。
标签: c# concurrency task-parallel-library async-await concurrentdictionary