2011-03-08 43 views
1

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

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

能否请您提出一个方法来获取返回的值?

+0

[从线程返回值?](http:// stackoverflow。com/questions/1314155/returns-a-value-from-thread) – 2013-10-01 14:38:15

回答

8

理想情况下,使用任务并行库和Task<T>来代替...但除此之外,您需要设置某种共享变量来表示结果;当线程完成后,读什么的线程,你需要它的结果。

另一种方法是使用委托返回一个bool并呼吁BeginInvoke对委托执行它的线程池,返回一个IAsyncResult这将允许您等待结果。

6

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

​​

要使用此代码,您可以使用Lambda(或委托)。下面是一个使用lambda表达式的例子:

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

似乎有很多工作要做,以避免异步委托。 – 2011-03-08 15:56:11

0

你可以有一个成员变量,该线程将设置,然后创建一个事件处理,它完成时该线程将设定。您等待事件句柄,然后在发出句柄信号后检查布尔。

5

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

bool result = doThis(); 

通常与异步执行,你会建立一个回调以获取结果:

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

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

void Callback(IAsyncResult ar) { 
    bool result = ((Func<bool>)ar.AsyncState).EndInvoke(ar); 
    // ... 
} 
+0

如果你只是等待结果,为什么要使用线程呢?...一个原因可能是开发人员不希望操作导致UI无响应(即当任务需要一段时间也许需要等到它完成)。在这种情况下使用线程可以改善感知的UI响应。 – Matt 2011-03-08 15:11:13

+0

@Matt Spinelli:产生一个线程,然后_immediately_等待它会_also_冻结UI ... – 2011-03-08 15:14:19

+0

这就是为什么我说_perceived_响应。是的,在这种情况下,应用程序仍然会等待,但对于在Vista和Windows 7上运行的桌面应用程序,您不会收到“无响应的窗口”消息和灰色窗口。您的解决方案确实适用于更典型的异步目的。所以+1。 – Matt 2011-03-08 15:20:54

0

我不会建议你有一个委托,它返回一些价值。有一种更好的方法可以在方法完成后从方法中获得一些价值,即通过使用“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; 
} 
1
static void Main(string[] args) 
    { 
     bool returnValue = false; 
     new Thread(
     () => 
      { 
       returnValue =test() ; 
      }).Start(); 
     Console.WriteLine(returnValue); 
     Console.ReadKey(); 
    } 

    public static bool test() 
    { 
     return true; 
    } 
0
public class ThreadExecuter<t> 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 }; 

       <b> ThreadExecuter<packet> te = new ThreadExecuter<packet>(sm.Send, writeScreen); 
       te.Start();</packet></packet></b> 
      } 

      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

+0

你应该真的开始使用TPL。与这样的事情一起工作要容易得多。 – Servy 2013-04-05 14:37:30