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”返回的响应。
答案 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();
}