2011-03-08 44 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