尝试调用需要参数的方法以获取结果并传递结果以继续。但我是Task领域的新手,似乎无法弄清楚正确的语法。任何帮助将不胜感激。
Task.Factory.StartNew(() =>
CheckConflict(startDate, endDate, actID, repeatRule,whichTime))
.ContinueWith(
GetConflictDelegate(result),
TaskScheduler.FromCurrentSynchronizationContext);
答案 0 :(得分:4)
假设您要继续CheckConflict()
的结果,ContinueWith
将Task<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());