C#从线程中调用的函数返回值

我有一个计算线程函数,它使用Invoke从其他线程调用消息函数,我希望计算线程从该消息函数获取值(值类型,如整数)。 我怎样才能做到这一点?

问题是我在Invoke(…)之后仍然得到x变量的旧值,我期望值为15

delegate void mes_del(object param); void MyThreadFunc() { ... int x = 5; object [] parms = new object []{x}; Invoke(new mes_del(MessageFunc), (object)parms); ... } void MessageFunc(object result) { int res = 15; (result as object[])[0] = res; } 

我尝试了一些方法,比如使用object [],object作为参数但没有成功。 我虽然拳击/拆箱操作应该在这种情况下发生,但他们不会。 我是否应该像在.NET事件模式中那样使用辅助类型,并创建像类holder {public int x; }

 int x = 5; object [] parms = new object []{x}; 

上面的代码所做的是声明一个局部变量,为它赋值5,然后构造一个object[]数组,其中包含一个元素,该元素是该局部变量的副本

然后,将此数组传递给Invoke调用。

我认为你会发现在Invoke之后, parms[0]是15.但是这不会影响x ,它实际上必须作为ref参数传递给任何方法才能修改它的本地值。


我之前见过的是这样的事情:

 class Box { public T Value { get; set; } } 

然后你可以这样做:

 void MyThreadFunc() { var x = new Box { Value = 5 }; // By the way, there's really no reason to define your own // mes_del delegate type. Invoke(new Action>(MessageFunc), x); } void MessageFunc(Box arg) { arg.Value = 15; } 

你是在谈论Windows Forms中的Control.Invoke吗? 如果是,该方法也可以返回结果,因此您可以编写:

 delegate int mes_del(int param); void MyThreadFunc() { int x = 5; object [] parms = new object []{x}; x = (int)Invoke(new mes_del(MessageFunc), x); // you'll get a new value of 'x' here (incremented by 10) } int MessageFunc(int result) { return result + 10; } 

您的代码可能无法正常工作,因为您正在访问x而不是从数组中选择一个新值(应该修改)。 但是,使用返回新值的重载应该是一个更清晰的解决方案。

只需从方法返回值

 void MyThreadFunc() { ... int x = 5; object [] parms = new object []{x}; var callResult = (int)Invoke((Func)MessageFunc, (object)parms); ... } int MessageFunc(object result) { int res = 15; return res; } 

也许你的问题的最佳答案是.NET 4.0 System.Threading.Tasks

这里主线程被阻塞,直到在另一个线程上调用的方法返回Result。 如果主线程已经返回结果到达WriteLine,则没有阻塞。

 Task task = Task.Factory.StartNew(SomeMethod); Console.WriteLine(task.Result); public static string SomeMethod() { return "Hello World"; } 

要么

 Task task = Task.Factory.StartNew(() => { return "Hello World"; } ); Console.WriteLine(task.Result); 

查看此博客以获取更多有趣的示例。