具有参数和返回值的Task.Factory.StartNew

时间:2014-03-10 03:28:22

标签: c#

尝试调用需要参数的方法以获取结果并传递结果以继续。但我是Task领域的新手,似乎无法弄清楚正确的语法。任何帮助将不胜感激。

Task.Factory.StartNew(() => 
    CheckConflict(startDate, endDate, actID, repeatRule,whichTime))
    .ContinueWith(
        GetConflictDelegate(result),
        TaskScheduler.FromCurrentSynchronizationContext);

5 个答案:

答案 0 :(得分:4)

假设您要继续CheckConflict()的结果,ContinueWithTask<T>作为参数。 Task<T>有一个属性Result,它将是方法调用的结果。

有关示例,请参阅下面的代码段。

new TaskFactory()
.StartNew(() =>
    {
        return 1;
    })
.ContinueWith(x =>
    {
        //Prints out System.Threading.Tasks.Task`1[System.Int32]
        Console.WriteLine(x);
        //Prints out 1
        Console.WriteLine(x.Result);
    });

答案 1 :(得分:3)

我建议您使用async / await

var result = await Task.Run(
    () => CheckConflict(startDate, endDate, actID, repeatRule, whichTime);
GetConflictDelegate(result);

答案 2 :(得分:0)

Task.Factory.StartNew<TResult>(new Func<TResult>(() =>
{
return 1;
}).ContinueWith<TResult>(new Action((result) =>
{
Console.Writeline(result.Result); // output: 1
});

试试这个

答案 3 :(得分:0)

您需要Task<TResult>类(请参阅MSDN - TaskFactory.StartNew-Methode (Func, Object)<TResult>是您调用方法的返回类型。 因为你开始一个新的线程,你必须等到线程完成而不阻塞主线程或引导消息泵停止。这是您可以使用async和await的地方。

假设一个方法Calculate(),它采用类型为double的两个参数并返回double的结果,另一个方法称为Validate(),用于验证结果。解决方案可能如下所示:

private async Task CalculateAsync()
{
    // Our parameter object
    CustomArgsObject customParameterObject = new CustomArgsObject() 
    {
        Value1 = 500,
        Value2 = 300
    };

    Task<double> returnTaskObject = await Task<double>.Factory.StartNew(
          (paramsHoldingValues)  => Calculate(paramsHoldingValues as CustomArgsObject), 
          customParameterObject);

    // Because of await the following lines will only be executed 
    // after the task is completed while the caller thread still has 'focus'
    double result = returnTaskObject.Result;
    Validate(result);
}

private double Calculate(CustomArgsObject values)
{
    return values.Value1 + values.Value2;
}

private bool Validate(double value)
{
    return (value < 1000);
}

await将焦点返回给调用者线程(调用CalculateAsync()的线程)以防止在任务运行时锁定。同时await强制处理CalculateAsync(),直到任务启动的行,然后等待任务完成。然后将处理CalculateAsync()的其余部分。 如果没有await,整个方法将被处理 - 在任务完成之前或与正在运行的任务同时进行。

Task<TResult>类(其中<TResult>是您的返回类型的占位符)有一个属性Result,其中包含<TResult>类型的返回值。

答案 4 :(得分:0)

这有效:

Task.Factory.StartNew(()=>
                {
                    return CheckConflict(startDate, endDate, actID, repeatRule,whichTime);

                }).ContinueWith(x=>
                    {
                        GetConflictDelegate(whichTime);
                    },TaskScheduler.FromCurrentSynchronizationContext());