从线程返回值

时间:2013-04-11 09:49:32

标签: c# multithreading

如果我创建了一个委托,允许将多个参数传递给线程启动方法,如this answer中所述,将RealStart方法中的值返回到最佳方法是什么?启动线程的方法?

在我看来,我的选择是创建一个静态变量。

private static Boolean result;
private static String message = "";

public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
  var t = new Thread(() => RealStart(param1, param2));
  t.Start();
  return t;
}

private static void RealStart(SomeType param1, SomeOtherType param2) {
  ...
}

或将代理包装在类

private class TestThread
{
    public String message = "";
    public Boolean result;

    public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
      var t = new Thread(() => RealStart(param1, param2));
      t.Start();
      return t;
    }

    private static void RealStart(SomeType param1, SomeOtherType param2) {
      ...
    }
}

我在使用类时看到的一个问题是,它在某种程度上否定了通过委托传递参数的点,因为我可以在初始化时将它们传递给类。

(或者不以这种方式使用它的第三种选择) RealStart可能有返回类型吗?

使用上述任何一个流程是否有任何利弊,即使它只是归结为代码的结构/组织?

2 个答案:

答案 0 :(得分:2)

使用Task和Task.Result:

    // Return a value type with a lambda expression
    Task<int> task1 = Task<int>.Factory.StartNew(() => 1);
    int i = task1.Result;

    // Return a named reference type with a multi-line statement lambda.
    Task<Test> task2 = Task<Test>.Factory.StartNew(() =>
    {
        string s = ".NET";
        double d = 4.0;
        return new Test { Name = s, Number = d };
    });
    Test test = task2.Result;

答案 1 :(得分:1)

您也可以使用操作(用于更新表单组件......):

public TextBox foo = new TextBox();
foo.Text = "foo";
.
.
.
Thread t = new Thread(() => FooBar(p1, p2) );
t.Start();

public void FooBar(Parm parm1, Parm parm2)
{
    ...
    this.foo.BeginInvoke(new Action(() => foo.Text = "bar"));
}