Task.Run 有输入参数和输出
Task.Run with Input Parameters and Output
效果很好:
private void MainMethod()
{
Task<bool> taskItemFound = new Task<bool>(ItemFound);
}
private bool ItemFound()
{
//Do Work
return true;
}
这可行,但很丑,我不能传递一个以上的参数:
private void MainMethod()
{
var startNew = Task<bool>.Factory.StartNew(TempMethod, "cow");
}
private bool TempMethod(object o)
{
return ("holy " + o == "holy cow");
}
我正在寻找一种解决方案,它可以从具有多个输入参数的现有方法中为我提供 Task<bool>
,并且 returns 是一个布尔值。理想情况下,它看起来像这样:
Task<bool> taskItemFound = new Task<bool>(ItemFound(param1, param2, param3));
你可以这样做:
bool result = await Task.Run(() => ItemFound(param1, param2, param3) );
或者如果你真的想要它 Task<bool>
:
Task<bool> t = new Task<bool>(() => ItemFound(param1, param2, param3) );
实际上,更清晰的方法是在对象内部传递参数。
您可以在下方找到轻松实现该目标的解决方案。
解决方案 1(长而清晰):传递一个包含参数的对象
只需创建一个 class 来保存参数:
class CustomParams
{
public int Param1 { get; set; }
public int Param2 { get; set; }
public int Param3 { get; set; }
}
然后在方法中只是将对象转换为 class
private bool TempMethod(object arguments)
{
var args = arguments as CustomParams;
// Do anything with args.Param1
// Do anything with args.Param2
// Do anything with args.Param3
// Return anything
return ("holy " + args.Param1 == "holy cow");
}
要调用,请使用:
Task<bool> taskItemFound = new Task<bool>(TempMethod, new CustomParams {
Param1 = 3,
Param2 = 5,
Param3 = 2
});
解决方案 2(hacky 但较短):使用元组作为参数
如果您不想创建class
,则可以使用
修改将对象转换为元组的方法:
private bool TempMethod(object arguments)
{
var args = arguments as Tuple<int,int,int>;
// Do anything with args.Item1
// Do anything with args.Item2
// Do anything with args.Item3
// Return anything
return ("holy " + args.Item1 == "holy cow");
}
然后使用:
Task<bool> taskItemFound = new Task<bool>(ItemFound, new Tuple<int, int>(3,5,7));
解决方案 3(超级 hacky,简短):使用动态对象
修改方法以接受 dynamic
而不是对象:
private bool TempMethod(dynamic arguments)
{
// Do anything with args.Param1
// Do anything with args.Param2
// Do anything with args.Param3
// Return anything
return ("holy " + arguments.Param1 == "holy cow");
}
然后用这个调用:
Task<bool> taskItemFound = new Task<bool>(TempMethod, new {Param1 = 3, Param2 = 44, Param3 = 564 });
效果很好:
private void MainMethod()
{
Task<bool> taskItemFound = new Task<bool>(ItemFound);
}
private bool ItemFound()
{
//Do Work
return true;
}
这可行,但很丑,我不能传递一个以上的参数:
private void MainMethod()
{
var startNew = Task<bool>.Factory.StartNew(TempMethod, "cow");
}
private bool TempMethod(object o)
{
return ("holy " + o == "holy cow");
}
我正在寻找一种解决方案,它可以从具有多个输入参数的现有方法中为我提供 Task<bool>
,并且 returns 是一个布尔值。理想情况下,它看起来像这样:
Task<bool> taskItemFound = new Task<bool>(ItemFound(param1, param2, param3));
你可以这样做:
bool result = await Task.Run(() => ItemFound(param1, param2, param3) );
或者如果你真的想要它 Task<bool>
:
Task<bool> t = new Task<bool>(() => ItemFound(param1, param2, param3) );
实际上,更清晰的方法是在对象内部传递参数。 您可以在下方找到轻松实现该目标的解决方案。
解决方案 1(长而清晰):传递一个包含参数的对象
只需创建一个 class 来保存参数:
class CustomParams
{
public int Param1 { get; set; }
public int Param2 { get; set; }
public int Param3 { get; set; }
}
然后在方法中只是将对象转换为 class
private bool TempMethod(object arguments)
{
var args = arguments as CustomParams;
// Do anything with args.Param1
// Do anything with args.Param2
// Do anything with args.Param3
// Return anything
return ("holy " + args.Param1 == "holy cow");
}
要调用,请使用:
Task<bool> taskItemFound = new Task<bool>(TempMethod, new CustomParams {
Param1 = 3,
Param2 = 5,
Param3 = 2
});
解决方案 2(hacky 但较短):使用元组作为参数
如果您不想创建class
,则可以使用修改将对象转换为元组的方法:
private bool TempMethod(object arguments)
{
var args = arguments as Tuple<int,int,int>;
// Do anything with args.Item1
// Do anything with args.Item2
// Do anything with args.Item3
// Return anything
return ("holy " + args.Item1 == "holy cow");
}
然后使用:
Task<bool> taskItemFound = new Task<bool>(ItemFound, new Tuple<int, int>(3,5,7));
解决方案 3(超级 hacky,简短):使用动态对象
修改方法以接受 dynamic
而不是对象:
private bool TempMethod(dynamic arguments)
{
// Do anything with args.Param1
// Do anything with args.Param2
// Do anything with args.Param3
// Return anything
return ("holy " + arguments.Param1 == "holy cow");
}
然后用这个调用:
Task<bool> taskItemFound = new Task<bool>(TempMethod, new {Param1 = 3, Param2 = 44, Param3 = 564 });