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
也许你的问题的最佳答案是.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);
查看此博客以获取更多有趣的示例。