如何在线程执行中捕获方法返回的值

本文关键字:方法 返回 线程 执行 | 更新日期: 2023-09-27 18:13:40

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"方法返回的响应

如何在线程执行中捕获方法返回的值

您可以使用Task<T>(如果您使用的是。net 4+),它具有返回值。您还可以使用事件在线程完成它所做的任何事情时获得通知,并以这种方式获取返回值。

我会使用微软的响应式框架。块"Rx-Main"。

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 */
});

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

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

然而,今天你有比原始线程更好的选择。看看c#中的TPL(任务并行库)和async/await。

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

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();
}