如何在线程执行中捕获方法返回的值
本文关键字:方法 返回 线程 执行 | 更新日期: 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();
}