如何捕获线程执行中从方法返回的值c#

时间:2015-09-20 12:03:39

标签: c# multithreading

Thread[] threads = new Thread[12];
int temp;


 for (int i = 0; i < threads.Length - 1; i++)
 {
       temp = i;
       threads[temp] = new Thread(new ThreadStart(()=>     test(test1[temp],"start", temp)));
       threads[temp].Start();
       //threads[temp].Join();
 }



for(int i=0; i<threads.Length-1; i++)
{
    threads[i].Join();
}

//需要捕获从线程中执行的方法“test1”返回的响应。

4 个答案:

答案 0 :(得分:1)

您可以使用Task<T>(如果您使用的是.NET 4+),它具有返回值。您还可以使用事件在线程完成任务时获得通知,并以此方式获取返回值。

答案 1 :(得分:1)

我会使用Microsoft的Reactive Framework来实现这一目标。 NugGet&#34; Rx-Main&#34;。

var query = 
    Observable
        .Range(0, 12)
        .SelectMany(n => Observable
            .Start(() => new
            {
                n,
                r = test(test1[n], "start", n)
            }))
        .ToArray()
        .Select(xs => xs
            .OrderBy(x => x.n)
            .Select(x => x.r)
            .ToArray());

query.Subscribe(rs =>
{
    /* do something with the results */
});

答案 2 :(得分:0)

您可以使用另一个ctor重载启动线程,您可以在其中启动线程并将对象传递给该线程。然后,线程将结果保存在该对象的字段中。调用Join后,主线程可以从所有这些对象中检索结果。你可以有一个包含12个对象的数组,每个对象都传递给一个线程。或者你可以有一个包含12个类的数组,每个类封装一个线程以及包装结果的相应对象:

public class ThreadResult
{
    public int Result {get; set;}
}

然而,今天你有比原始线程更好的选择。看看C#中的TPL(任务并行库)和异步/等待。

答案 3 :(得分:0)

您还可以使用共享状态,在这种情况下,您必须锁定对线程方法内的共享对象的每次访问:

Thread[] threads = new Thread[12];

int temp;
string msg = "";
List<string> results = new List<string>();

for (int i = 0; i < threads.Length; i++)
{
    temp = i;

    threads[temp] = new Thread(() =>
    {
        lock (results)
        {
            lock (msg)
            {
                msg = "Hello from Thread " + Thread.CurrentThread.ManagedThreadId;
                results.Add(msg);
            }                        
        }
    });

    threads[temp].Start();
}


for (int i = 0; i < threads.Length; i++)
{
    threads[i].Join();
}