正如我们所知,C#的内置线程模型不支持将返回值从一个线程传递回创建它的“父”线程。我正在用C#实现一个用于矩阵计算的小型编译器。编译器使用System.Reflection.Emit名称空间生成IL代码。对于这个编译器,我计划实现调用-返回语义。有人能给我指出一个使用C# Thread (或其他技术)实现调用-返回语义的合适技术吗?
发布于 2011-07-27 15:33:34
看一看Task Class
任务类
表示可以返回值的异步操作。
示例1:启动新任务并等待任务完成
var task = Task<int>.Factory.StartNew(() => GenerateResult());
task.Wait();
Console.WriteLine(task.Result);示例2:启动新任务,并在任务完成后继续执行操作
var task = Task<int>.Factory.StartNew(() => GenerateResult());
task.ContinueWith(t =>
{
Console.WriteLine(t.Result);
});发布于 2011-07-27 15:10:06
更多的细节将是有用的,但是...
为了将“返回值”返回给父线程,你需要一些会合机制。它可以很简单(父线程阻塞并等待完成),也可以更复杂(例如,使用异步模式(BeginXxx EndXxx,如BeginSend EndSend)或continuations )。
在最简单的情况下,一个想法可能是将“并发调用”包装在一个类中,该类包含线程和一个用于返回值的字段(您可能希望使该类成为泛型)。对于更复杂(更高效!)使用异步的实现,我真的建议研究一下第三方编程语言(.NET 4并行库)。尤其是Task.ContinueWith:如果你能在你的编译器中把调用-返回转换成一系列的延续,这将是一个很好的实现!
更多细节:假设你有这样的序列:
Matrix a = blah;
Matrix b = ConcurrentOperationOnMatrix(a);
// this must block, wait for the prev line to complete
AnotherOperationOnMatrix(b); 您可以在一个延续列表中对其进行转换:
ConcurrentOperationOnMatrix(a, b => AnotherOperationOnMatrix(b)); 每个函数永远不会返回,它只是在完成时调用程序的其余部分。查看F#异步工作流,它们使用相同的技术。
发布于 2011-07-27 15:09:58
您是否考虑过使用.Net框架用于其所有回调风格编程的IAsyncResult。基本上,您可以在进行函数调用时使用return an IAsyncResult。然后,可以使用AsyncWaitHandle属性发回信号通知调用方结果已就绪,并在AsyncState属性中传递结果。
这是一种使用预定义类来执行所需操作的干净方法。您可以实现某种信号,然后实现像共享变量这样的东西来传回结果。如果您需要尝试让互锁代码尽可能高性能地工作,这可能会对您有所帮助。
https://stackoverflow.com/questions/6840538
复制相似问题