0

如果我创建了一个委托以允许将多个参数传递到线程启动方法中,如本答案中所述,那么将值从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有返回类型吗?

使用所描述的任何一个过程是否有任何优点或缺点,即使它只是归结为代码的结构/组织?

4

2 回答 2

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;
于 2013-04-11T09:52:16.490 回答
1

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

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"));
}
于 2013-04-30T20:41:24.700 回答