2013-04-11 201 views
0

如果我创建了一个允许将多个参数传递给线程启动方法的代理(如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曾经有一个返回类型?

即使它只是涉及到代码的结构/组织,是否有任何优点或缺点使用任何一个描述的流程?

+0

有没有什么不能使用的理由'Task'?因为这就是我通常会使用的。 – 2013-04-11 09:51:34

回答

2

使用任务,并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

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

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")); 
}