2013-04-11 96 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")); 
}