tasks[0] = new Task(() => Philosoph.Essen("1", gabeln[2], gabeln[1]));
tasks[1] = new Task(() => Philosoph.Essen("2", gabeln[3], gabeln[2]));
tasks[2] = new Task(() => Philosoph.Essen("3", gabeln[4], gabeln[3]));
tasks[3] = new Task(() => Philosoph.Essen("4", gabeln[5], gabeln[4]));
tasks[4] = new Task(() => Philosoph.Essen("5", gabeln[1], gabeln[5]));
Parallel.ForEach(tasks, t =>
{
t.Start();
});
Task.WaitAll(tasks);
static public string Essen(String philosoph, String linkeGabel, String rechteGabel)
{
lock (linkeGabel)
{
lock (rechteGabel)
{
return ("Philosoph " + philosoph + "isst mit: " + linkeGabel + ", " + rechteGabel );
}
}
}
如何处理Essen() - 在5个并行处理中的每个处理返回值?我想将这些返回值写入列表框...
答案 0 :(得分:2)
您使用ContinueWhenAll
:
// once tasks are started
TaskFactory.ContinueWhenAll(
tasks,
results =>
{
foreach (var t in results)
{
if (t.IsCompleted)
listBox.Items.Add(t.Result);
}
},
cts.Token,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
请务必为ListBox
使用正确的日程安排程序。此外,您需要确保“观察”可能发生的任何Task<TResult>.Exception
(例如,如果t.IsFaulted
结帐t.Exception
)。
但是,目前您的任务未定义为返回任何内容。您需要将其定义更改为Task<TResult>
:
// will use the return type of Philosoph.Essen, which is string
// Task<string>[] tasks;
var tasks = new []
{
Task.Factory.StartNew(() => Philosoph.Essen("1", gabeln[2], gabeln[1])),
Task.Factory.StartNew(() => Philosoph.Essen("2", gabeln[3], gabeln[2])),
Task.Factory.StartNew(() => Philosoph.Essen("3", gabeln[4], gabeln[3])),
Task.Factory.StartNew(() => Philosoph.Essen("4", gabeln[5], gabeln[4])),
Task.Factory.StartNew(() => Philosoph.Essen("5", gabeln[1], gabeln[5])),
};