我看到Thread类有4个构造函数:
public Thread(ParameterizedThreadStart start);
public Thread(ThreadStart start);
public Thread(ParameterizedThreadStart start, int maxStackSize);
public Thread(ThreadStart start, int maxStackSize);
ParameterizedThreadStart 和 ThreadStart 是这样的委托:
public delegate void ThreadStart();
public delegate void ParameterizedThreadStart(object obj);
例如,如果我想创建返回int的线程启动函数怎么办? 我看到构造函数只有在我想要返回void时才是好的。
答案 0 :(得分:2)
您可以使用Task Parallel Library来获得返回值。如果您确实想要分配新线程,则可以使用Task.Factory.StartNew
的正确重载:
public int DoSomething() { return 42; }
public async Task FooAsync()
{
int value = await Task.Factory.StartNew(
() => DoSomething(), TaskCreationOptions.LongRunning);
}
如果您实际上不需要新的线程分配,并且可以使用线程池线程,那么使用Task.Run
会更简单,更好:
public async Task FooAsync()
{
int value = await Task.Run(() => DoSomething());
}
修改强>
如果由于一些奇怪的原因你真的想要使用Thread
类,你可以通过关闭一个变量并将它传递给Thread.Start
的委托传递来实现这一点,并依赖于副作用线程开始运行后创建:
var x = 5;
var thread = new Thread(() =>
{
var x = DoSomething();
});
thread.Start();
thread.Join(); // This will synchronously block the thread.
Console.WriteLine(x);
如果你可以使用TPL,我会绝对试图避免这个。
答案 1 :(得分:0)
您可以使用:
public void StartThread()
{
ParameterizedThreadStart pts = new ParameterizedThreadStart(this.DoWork);
Thread th = new Thread(pts);
int i =5;
th.Start(i);
}
public void DoWork(object data)
{
Console.WriteLine("I got data='{0}'", data);
}
或更短
Thread th = new Thread(this.DoWork);
答案 2 :(得分:0)
可以通过从线程创建返回值。然后你应该使用lambda表达式来获取这个变量。为此变量分配一个" return"来自工作线程的值,然后必须等到线程从父线程结束。
int value = 5; // a variable to store the return value
var thread = new Thread(() =>
{
value = 10; // Assign value to the return variable
});
thread.Start();
thread.Join();
Console.WriteLine(value); // use your variable to show in parent thread