我有一個返回bool
值的方法。 我想通過Thread
執行該方法。返回類型的線程
Thread t1 = new Thread(new ThreadStart(doThis));
能否請您提出一個方法來獲取返回的值?
我有一個返回bool
值的方法。 我想通過Thread
執行該方法。返回類型的線程
Thread t1 = new Thread(new ThreadStart(doThis));
能否請您提出一個方法來獲取返回的值?
理想情況下,使用任務並行庫和Task<T>
來代替...但除此之外,您需要設置某種共享變量來表示結果;當線程完成後,讀什麼的線程,你需要它的結果。
另一種方法是使用委託返回一個bool
並呼籲BeginInvoke
對委託執行它的線程池,返回一個IAsyncResult
這將允許您等待結果。
線程沒有返回值。但是還有一些解決方法,比如將線程包裝到類中。該解決方案使用一個類來存儲要執行的方法(間接)並存儲返回值。該類可用於任何函數和任何返回類型。您只需使用返回值類型實例化對象,然後傳遞該函數以通過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...
}
似乎有很多工作要做,以避免異步委託。 – 2011-03-08 15:56:11
你可以有一個成員變量,該線程將設置,然後創建一個事件處理,它完成時該線程將設定。您等待事件句柄,然後在發出句柄信號後檢查布爾。
如果你只是在等待結果,爲什麼要使用線程呢?
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);
// ...
}
如果你只是等待結果,爲什麼要使用線程呢?...一個原因可能是開發人員不希望操作導致UI無響應(即當任務需要一段時間也許需要等到它完成)。在這種情況下使用線程可以改善感知的UI響應。 – Matt 2011-03-08 15:11:13
@Matt Spinelli:產生一個線程,然後_immediately_等待它會_also_凍結UI ... – 2011-03-08 15:14:19
這就是爲什麼我說_perceived_響應。是的,在這種情況下,應用程序仍然會等待,但對於在Vista和Windows 7上運行的桌面應用程序,您不會收到「無響應的窗口」消息和灰色窗口。您的解決方案確實適用於更典型的異步目的。所以+1。 – Matt 2011-03-08 15:20:54
我不會建議你有一個委託,它返回一些價值。有一種更好的方法可以在方法完成後從方法中獲得一些價值,即通過使用「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;
}
static void Main(string[] args)
{
bool returnValue = false;
new Thread(
() =>
{
returnValue =test() ;
}).Start();
Console.WriteLine(returnValue);
Console.ReadKey();
}
public static bool test()
{
return true;
}
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
你應該真的開始使用TPL。與這樣的事情一起工作要容易得多。 – Servy 2013-04-05 14:37:30
[從線程返回值?](http:// stackoverflow。com/questions/1314155/returns-a-value-from-thread) – 2013-10-01 14:38:15