首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的调用返回语义

C#中的调用返回语义
EN

Stack Overflow用户
提问于 2011-07-27 14:58:38
回答 3查看 157关注 0票数 0

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-27 15:33:34

看一看Task Class

任务类

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

示例1:启动新任务并等待任务完成

代码语言:javascript
复制
var task = Task<int>.Factory.StartNew(() => GenerateResult());

task.Wait();
Console.WriteLine(task.Result);

示例2:启动新任务,并在任务完成后继续执行操作

代码语言:javascript
复制
var task = Task<int>.Factory.StartNew(() => GenerateResult());

task.ContinueWith(t =>
{
    Console.WriteLine(t.Result);
});
票数 4
EN

Stack Overflow用户

发布于 2011-07-27 15:10:06

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

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

在最简单的情况下,一个想法可能是将“并发调用”包装在一个类中,该类包含线程和一个用于返回值的字段(您可能希望使该类成为泛型)。对于更复杂(更高效!)使用异步的实现,我真的建议研究一下第三方编程语言(.NET 4并行库)。尤其是Task.ContinueWith:如果你能在你的编译器中把调用-返回转换成一系列的延续,这将是一个很好的实现!

更多细节:假设你有这样的序列:

代码语言:javascript
复制
Matrix a = blah; 
Matrix b = ConcurrentOperationOnMatrix(a); 
// this must block, wait for the prev line to complete
AnotherOperationOnMatrix(b); 

您可以在一个延续列表中对其进行转换:

代码语言:javascript
复制
ConcurrentOperationOnMatrix(a, b => AnotherOperationOnMatrix(b)); 

每个函数永远不会返回,它只是在完成时调用程序的其余部分。查看F#异步工作流,它们使用相同的技术。

票数 2
EN

Stack Overflow用户

发布于 2011-07-27 15:09:58

您是否考虑过使用.Net框架用于其所有回调风格编程的IAsyncResult。基本上,您可以在进行函数调用时使用return an IAsyncResult。然后,可以使用AsyncWaitHandle属性发回信号通知调用方结果已就绪,并在AsyncState属性中传递结果。

这是一种使用预定义类来执行所需操作的干净方法。您可以实现某种信号,然后实现像共享变量这样的东西来传回结果。如果您需要尝试让互锁代码尽可能高性能地工作,这可能会对您有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6840538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档