从System.Threading.Task-Method返回值?

时间:2013-06-05 16:50:37

标签: c# multithreading parallel-processing

我正在创建一个由5个任务组成的数组,调用字符串返回方法“Essen”

        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

启动这些任务
       Parallel.ForEach(tasks, t =>
        {

            t.Start();
        });
        Task.WaitAll(tasks); 

方法Essen返回String

    static public string Essen(String philosoph, String linkeGabel, String rechteGabel)
    {
        lock (linkeGabel)
        {
            lock (rechteGabel)
            {
               return ("Philosoph " + philosoph + "isst mit: " + linkeGabel + ", " + rechteGabel );
            }
        }
    }

如何处理Essen() - 在5个并行处理中的每个处理返回值?我想将这些返回值写入列表框...

1 个答案:

答案 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])),
};
相关问题