【发布时间】:2016-04-21 06:58:50
【问题描述】:
我正在尝试创建一种将要运行的任务排队的方法,因此我尝试使用BlockingCollection 来实现它。我发现的问题是每当我尝试添加Task 时,任务都会执行。示例代码如下:
private void button1_Click(object sender, EventArgs e)
{
textBox2.Clear();
for (int i = 0; i < 10; i++)
_processCollection.Add(BigTask(i));
}
static BlockingCollection<Task> _processCollection = new BlockingCollection<Task>();
Thread ConsumerThread = new Thread(LaunchConsumer);
private static async void LaunchConsumer()
{
while (true)
{
var processTask = _processCollection.Take();
await Task.Run(() => processTask);
}
}
async Task BigTask(int i)
{
await Task.Delay(5000);
textBox2.AppendText($"Text{i}\n");
}
似乎在调试中发生的所有任务似乎都在运行,因为它们被添加到阻塞集合中。我尝试将阻塞集合切换为使用Action,但这只会导致没有任何事情发生。如下(仅显示更改):
private void button1_Click(object sender, EventArgs e)
{
textBox2.Clear();
for (int i = 0; i < 10; i++)
{
int iC = i;
_processCollection.Add(async () => await BigTask(iC));
}
}
static BlockingCollection<Action> _processCollection = new BlockingCollection<Action>();
Thread ConsumerThread = new Thread(LaunchConsumer);
private static async void LaunchConsumer()
{
while (true)
{
var processTask = _processCollection.Take();
await Task.Run(processTask);
}
}
我觉得我在某个地方犯了一些小错误,因为感觉这应该可行。我试图找人做类似的事情但没有运气,这让我觉得我的概念可能有缺陷,所以请随意提出替代方案。
【问题讨论】:
标签: c# task-parallel-library blockingcollection