带返回类型的线程

时间:2011-03-08 13:34:32

标签: c# .net multithreading

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

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

你能否建议一种获得返回值的方法?

7 个答案:

答案 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