Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 行动<;T>;vs标准回报_C#_Design Patterns_Asynchronous_Task Parallel Library - Fatal编程技术网

C# 行动<;T>;vs标准回报

C# 行动<;T>;vs标准回报,c#,design-patterns,asynchronous,task-parallel-library,C#,Design Patterns,Asynchronous,Task Parallel Library,我不是C#guy,我更喜欢客观C,但最近我看到了很多实现: public void Method(Action<ReturnType> callback, params...) 其中一个例子是MVVM轻型框架,开发人员使用第一种方法实现数据服务契约(和实现),所以我的问题是:为什么会这样?只是喜欢的问题,或者是defaut异步的第一种方法(给定函数指针)。如果这是真的,那么标准回报是死亡吗?我问,因为我个人喜欢第二种方法,当我看到API时,我会更加清楚。与API返回的ReturnT

我不是C#guy,我更喜欢客观C,但最近我看到了很多实现:

public void Method(Action<ReturnType> callback, params...)

其中一个例子是MVVM轻型框架,开发人员使用第一种方法实现数据服务契约(和实现),所以我的问题是:为什么会这样?只是喜欢的问题,或者是defaut异步的第一种方法(给定函数指针)。如果这是真的,那么标准回报是死亡吗?我问,因为我个人喜欢第二种方法,当我看到API时,我会更加清楚。

与API返回的
ReturnType
不同,带有回调的版本可以立即返回,稍后再执行回调。如果要返回的值不能立即获得,并且获取它需要相当长的延迟,那么这一点可能很重要。例如,从web服务请求数据的API和API可能需要相当长的时间。当不需要继续处理结果数据时,可以启动调用并提供异步回调。这样,调用者就可以立即处理通知,并在通知可用时处理通知

考虑一个API,它获取图像的URL,并返回图像的内存表示形式。如果你的API是

Image GetImage(URL url)
void Method(Action<Image> callback, URL url)
您的用户需要拉取10个图像,他们可能需要等待每个图像完成加载,然后再请求下一个图像,或者显式启动多个线程

另一方面,如果您的API是

Image GetImage(URL url)
void Method(Action<Image> callback, URL url)
void方法(操作回调,URL)

然后API的用户将同时启动所有十个请求,并在图像异步可用时显示它们。这种方法极大地简化了用户需要执行的线程编程。

第一种方法可能是异步方法,该方法立即返回,并在操作完成后调用回调

第二种方法是为C#中的(同步)方法执行方法返回的标准方法


当然,API设计师可以自由地做出他们认为合适的任何签名;而且,可能还有其他底层细节来证明回调样式的合理性。但是,根据经验,如果您看到回调样式,则希望该方法是异步的。

如果您还没有遇到它,使用任务并行库,提供异步方法的库通常会提供任务方法(参数…),而不是回调,但对于需要使用不支持任务的框架的库来说,这可能不是一个选项(例如,Silverlight在版本5中添加了任务,所以Silverlight 4或之前的任何东西都需要使用回调或其他模式)@JamesManning我已经看到了TPL的实现,看起来非常清晰。它们在封面后面是一样的吗?我认为这取决于实现库是什么。从概念上讲,TPL有点“更好”(IMHO),因为它处理诸如取消和异常之类的事情。有了新的语言功能,您还可以使用await关键字编写“感觉”像同步代码的代码,这样您就不必编写回调方法,让编译器重写该方法来为您执行此操作。您知道Java中有任何等价物吗?@dantuch Java没有委托,因此没有直接等价物。但是,您可以使用带有单个方法的接口来执行类似的操作。然后您可以使用匿名类来实现它。