如果我创建了一个委托,允许将多个参数传递给线程启动方法,如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 :(得分: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"));
}