从Thread返回一个值

时间:2015-11-25 08:06:11

标签: c# multithreading

我看到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时才是好的。

3 个答案:

答案 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