【发布时间】:2011-08-01 07:12:36
【问题描述】:
我有一个场景,我正在做一些 Actor-Model 类型的消息队列,我想要一个方法来插入任务或委托到队列中(可能是新的 ConcurrentQueue),等待其他一些进程来处理队列,执行任务然后返回结果,最好不加锁。该方法可以同步和异步调用。只能同时运行一个排队的操作
我不知道如何以某种高效的方式完成此任务,请帮助:)
编辑
这是一个尝试,有人发现这种方法有任何问题(排除异常处理)吗?另外,我可以想象这与简单的锁定相比有相当多的开销,它与例如使用异步委托相比如何?
public partial class Form1 : Form
{
private BlockingCollection<Task<int>> blockingCollection = new BlockingCollection<Task<int>>(new ConcurrentQueue<Task<int>>());
private int i = 0;
public Form1() {
InitializeComponent();
Task.Factory.StartNew(() =>
{
foreach (var task in blockingCollection.GetConsumingEnumerable()) {
task.Start();
task.Wait();
}
});
}
public int Queue() {
var task = new Task<int>(new Func<int>(DoSomething));
this.blockingCollection.Add(task);
task.Wait();
return task.Result;
}
public int DoSomething() {
return Interlocked.Increment(ref this.i);
}
private void button1_Click(object sender, EventArgs e) {
Task.Factory.StartNew(() => Console.Write(this.Queue()));
}
}
【问题讨论】:
-
框架中的 TPL Task 并行库与您的需求有什么差距?队列仅由框架处理,根据您的要求有不同的同步选择。
-
您可能想查看 SmartThreadPool 库 (smartthreadpool.codeplex.com),它可能适合您的需求。
标签: c# concurrency asynchronous task