c#中的调用-返回语义

本文关键字:返回 语义 调用 | 更新日期: 2023-09-27 18:03:32

正如我们所知,c#的内置线程模型不支持将一个线程的返回值传递给创建它的"父"线程。我在c#中实现了一个用于矩阵计算的小型编译器。编译器使用System.Reflection.Emit名称空间生成IL代码。对于这个编译器,我计划实现调用-返回语义。有人能给我指出一个合适的技术来实现调用返回语义使用c# Thread(或任何其他技术)?

c#中的调用-返回语义

看看任务类:

Task

表示一个可以返回值的异步操作。

示例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);
});

更多的细节将是有用的,但是…

为了得到一个"返回值"回到父线程,你需要一些会合机制。它可以很简单(父线程阻塞并等待完成),也可以更复杂(使用异步模式(BeginXxx EndXxx,如BeginSend EndSend)或延续,例如)。

在最简单的情况下,一个想法可能是将你的"并发调用"包装在一个类中,这个类包含线程和返回值的字段(你可能想让这个类泛型)。对于使用异步的更复杂(和高效)的实现,我真的建议查看TPL()。. 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#异步工作流,它们使用相同的技术。

您是否考虑过使用。net框架使用的所有回调风格编程的IAsyncResult。基本上你可以使用返回IAsyncResult当你做你的函数调用。然后,你可以使用AsyncWaitHandle属性向调用者返回信号,告知结果已经准备好,并在AsyncState属性中传递结果。

这是一种使用预定义类来完成所需操作的干净方法。您可以实现某种信号,然后实现共享变量之类的东西来传递结果。如果您需要尝试并使联锁代码尽可能高效地工作,这可能会对您有所帮助。