我有一个返回bool
值的方法。
我想通过Thread
执行该方法。
Thread t1 = new Thread(new ThreadStart(doThis));
你能否建议一种获得返回值的方法?
答案 0 :(得分:8)
理想情况下,使用任务并行库和Task<T>
代替......但是否则,您需要设置某种共享变量来表示结果;线程完成后,从你需要的任何线程中读取结果。
另一种方法是使用一个委托,它返回一个bool
并在该委托上调用BeginInvoke
来在线程池上执行它,返回一个IAsyncResult
,这将允许你等待为了结果。
答案 1 :(得分:6)
线程没有返回值。但是有一些解决方法,比如在一个类中包装线程。此解决方案使用类来存储要执行的方法(间接)并存储返回值。该类可用于任何函数和任何返回类型。您只需使用返回值类型实例化对象,然后通过lambda(或委托)传递函数进行调用。
public class ThreadedMethod<T>
{
private T result;
public T Result
{
get { return result; }
private set { result = value; }
}
public ThreadedMethod()
{
}
//If supporting .net 3.5
public void ExecuteMethod(Func<T> 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<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...
}
答案 2 :(得分: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);
// ...
}
答案 3 :(得分: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;
}
答案 4 :(得分:0)
您可以拥有该线程将设置的成员变量,然后创建一个线程在完成时将设置的事件句柄。等待事件句柄,然后在发出句柄信号后检查bool。
答案 5 :(得分: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;
}
答案 6 :(得分: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