具有返回类型的线程

我有一个返回bool值的方法。 我想通过Thread执行该方法。

Thread t1 = new Thread(new ThreadStart(doThis));

你能建议一种获得返回价值的方法吗?

理想情况下,使用Tasks Parallel Library和Task代替……但是否则,您需要设置某种共享变量来表示结果; 线程完成后,从你需要的任何线程中读取结果。

另一种方法是使用一个委托,它返回一个bool并在该委托上调用BeginInvoke在线程池上执行它,返回一个IAsyncResult ,它允许你等待结果。

线程没有返回值。 但是有一些解决方法,比如在一个类中包装线程。 此解决方案使用类来存储要执行的方法(间接)并存储返回值。 该类可用于任何函数和任何返回类型。 您只需使用返回值类型实例化对象,然后传递函数以通过lambda(或委托)进行调用。

 public class ThreadedMethod { private T result; public T Result { get { return result; } private set { result = value; } } public ThreadedMethod() { } //If supporting .net 3.5 public void ExecuteMethod(Func func) { Result = func.Invoke(); } //If supporting only 2.0 use this and //comment out the other overload public void ExecuteMethod(Delegate d) { Result = (T)d.DynamicInvoke(); } } 

要使用此代码,您可以使用Lambda(或委托)。 以下是使用lambdas的示例:

 ThreadedMethod threadedMethod = new ThreadedMethod(); Thread workerThread = new Thread((unused) => threadedMethod.ExecuteMethod(() => SomeMethod())); workerThread.Start(); workerThread.Join(); if (threadedMethod.Result == false) { //do something about it... } 

如果您只是想等待结果,为什么要使用线程呢?

 bool result = doThis(); 

通常使用异步执行,您需要设置回调以获得结果:

 Func handle = doThis; handle.BeginInvoke(Callback, handle); // asynchronous invocation // can do more work... 

然后你会得到这样的回调结果:

 void Callback(IAsyncResult ar) { bool result = ((Func)ar.AsyncState).EndInvoke(ar); // ... } 
  static void Main(string[] args) { bool returnValue = false; new Thread( () => { returnValue =test() ; }).Start(); Console.WriteLine(returnValue); Console.ReadKey(); } public static bool test() { return true; } 

您可以拥有该线程将设置的成员变量,然后创建一个线程在完成时将设置的事件句柄。 等待事件句柄,然后在发出句柄信号后检查bool。

我不建议你有一个返回一些值的委托。 有一种更好的方法可以在方法执行完毕后从方法中获取一些值,即使用“out”参数。

在您的情况下,您可以使用以下代码:

 public delegate void DoThisWithReturn(out bool returnValue); public static void DoThisMethod(out bool returnValue) { returnValue = true; } public static void Start() { var delegateInstance = new DoThisWithReturn(DoThisMethod); bool returnValue; var asyncResult = delegateInstance.BeginInvoke(out returnValue, null, null); //Do Some Work.. delegateInstance.EndInvoke(out returnValue, asyncResult); var valueRecievedWhenMethodDone = returnValue; } 
 public class ThreadExecuter where T : class { public delegate void CallBack (T returnValue); public delegate T Method(); private CallBack callBack; private Method method; private Thread t; public ThreadExecuter(Method _method, CallBack _callBack) { this.method = _method; this.callBack = _callBack; t = new Thread(this.Process); } public void Start() { t.Start(); } public void Abort() { t.Abort(); callBack(null); } public void Join() { t.Join(); } private void Process() { callBack(method()); } } 

用法:

 namespace Tester { class Program { static void Main(string[] args) { #region [ Paket Data] ... #endregion for (int i = 0; i < 20; i++) { Packet packet = new Packet() { Data = data, Host = "www.google.com.tr", Port = 80, Id = i }; SocketManager sm = new SocketManager() { packet = packet };  ThreadExecuter te = new ThreadExecuter(sm.Send, writeScreen); te.Start(); } Console.WriteLine("bitti."); Console.ReadKey(); } private static void writeScreen(Packet p) { Console.WriteLine(p.Id + " - " + p.Status.ToString()); } } } 

资料来源: http : //onerkaya.blogspot.com/2013/04/returning-value-from-thread-net.html