返回类型的线程
我有一个返回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:// *。com/questions/1314155/returns-a-value-from-thread) – 2013-10-01 14:38:15