如果你在写.NET 2.0的WinForm,BackgroundWorker最适合不过了,还会自动向UI线程送结果,不需要Invoke什么的下面是不能用BackgroundWorker时候的解法;调用方和被调用方可以在不同的类里面输入输出参数的封装类:class ThreadMethodArgs { public volatile DataTable ReturnValue; public readonly int Parameter; public ThreadMethodArgs(int parameter) { Parameter = parameter; } public bool HasReturnValue { get { return ReturnValue != null; } } }调用方:private ThreadMethodArgs args;private void StartThreadMethod(int p) { args = new ThreadMethodArgs(p); ThreadPool.QueueUserWorkItem(new WaitCallback(xxx.ThreadMethod), args); // 然后可以开个Timer什么的来轮询 args.HasReturnValue }被调用方:private void ThreadMethod(object state) { ThreadMethodArgs args = (ThreadMethodArgs)state; // do work args.ReturnValue = blablabla; }
public class Info { private static string u = ""; public UserInfo(string u_u) { u=u_u; } public static string Uinfor { get { return u; } } } 在被线程调用的方法里实例化Info info = new Info(值) 在外部就可以通过Info.Uinfor访问。 (说白了就等于全局变量)
把返回值赋个这个变量
这个变量就是了
.net好像不支持带参数的线程,反正俺没用过,都是这么玩的,传参数也是
public volatile DataTable ReturnValue;
public readonly int Parameter;
public ThreadMethodArgs(int parameter) {
Parameter = parameter;
}
public bool HasReturnValue { get { return ReturnValue != null; } }
}调用方:private ThreadMethodArgs args;private void StartThreadMethod(int p) {
args = new ThreadMethodArgs(p);
ThreadPool.QueueUserWorkItem(new WaitCallback(xxx.ThreadMethod), args);
// 然后可以开个Timer什么的来轮询 args.HasReturnValue
}被调用方:private void ThreadMethod(object state) {
ThreadMethodArgs args = (ThreadMethodArgs)state;
// do work
args.ReturnValue = blablabla;
}
{
private static string u = "";
public UserInfo(string u_u)
{
u=u_u;
}
public static string Uinfor
{
get { return u; }
} }
在被线程调用的方法里实例化Info info = new Info(值)
在外部就可以通过Info.Uinfor访问。
(说白了就等于全局变量)
虽然你给分了但是我不再提供这个方法不舒服例如你的方法是private DataTable MyLongMethod(int p) {
... ... ...
}那其实有个很简单的办法将它改成线程方法,说白了其实就是异步调用首先建立一个委托:
private delegate DataTable MyLongMethodDelegate(int p);然后,调用的时候,利用委托自带的异步调用方法:MyLongMethodDelegate d = new MyLongMethodDelegate(MyLongMethod);// BeginInvoke(原参数列表, AsyncCallback 工作做完后要调用的方法, object 任意自定义状态对象)
d.BeginInvoke(p, new AsyncCallback(EndMyLongMethod), d); // 把刚才创建的委托作为状态对象传给异步处理机制然后写一个结束调用的方法:
private void EndMyLongMethod(IAsyncResult ar) {
if (InvokeRequired) // 在WinForm下需要——将过程送回UI线程
BeginInvoke(new AsyncCallback(EndMyLongMethod), ar);
else { // 如果不在WinForm下,就可以去掉if-else,只写下面的代码
// 从异步调用的状态对象里把之前创建的委托拿出来:
MyLongMethodDelegate d = (MyLongMethodDelegate)ar.State;
// 然后结束调用:
DataTable result = d.EndInvoke(ar);
// 现在就处理这个结果吧
}
}