我正在考虑一些遗留代码,并且我已经更新了下面的ThreadStart语句中使用的Task.Execute方法,以便在另一个上下文中使用。但是现在它导致编译错误,说Task.Execute的返回类型错误。
为什么会这样,我如何解决这个问题,以便保留我的返回值以及ThreadStart?
ThreadStart start = new ThreadStart(Task.Execute);
Thread asyncThread = new Thread(start);
asyncThread.IsBackground = true;
asyncThread.Start();
答案 0 :(得分:4)
ThreadStart
的返回类型为void
,因此您必须传递返回void
的方法。如果Task.Execute
为非void,则可以使用lambda表达式:
ThreadStart start = new ThreadStart(() => Task.Execute());
答案 1 :(得分:3)
您需要为Execute
方法编写一个不返回值的包装器,因为ThreadStart
委托需要一个void
返回类型的方法:
public static class Task
{
public static int Execute()
{
//blah blah blah
return 1;
}
public static void ExecuteWrapper()
{
Execute();
}
}
然后:
ThreadStart start = new ThreadStart(Task.ExecuteWrapper);
Thread asyncThread = new Thread(start);
asyncThread.IsBackground = true;
asyncThread.Start();
但是可以安全地忽略返回值吗?这经常指出设计问题。
答案 2 :(得分:0)
简单和短包装(除非你想记住返回值):
ThreadStart start = new ThreadStart(() => { Task.Execute(); });
...