C# 为什么begin方法会去掉参数?
我是异步编程新手,我在读一本书,书中展示了下面的一些示例API:C# 为什么begin方法会去掉参数?,c#,.net,asynchronous,C#,.net,Asynchronous,我是异步编程新手,我在读一本书,书中展示了下面的一些示例API: // synchronous version SearchResults GetResults(int page, int pageSize, out int itemsReturned); // asynchronous version IAsyncResult BeginGetResults(int page, int pageSize,
// synchronous version
SearchResults GetResults(int page, int pageSize, out int itemsReturned);
// asynchronous version
IAsyncResult BeginGetResults(int page,
int pageSize,
out int itemsReturned,
AsyncCallback callback,
object state);
SearchResults EndGetResults(out int itemsReturned, IAsyncResult iar);
请注意,Begin方法将“out”参数作为out int itemsReturned
以下是作者的解释:
事实证明这是一个抽象概念。CLR没有out参数的概念;这是一个C#语言习语。在CLR级别,out参数只是ref参数,而C#编译器才是它的核心
强制执行特定的使用模式。因为异步编程模型不是特定于语言的特性,所以它必须符合CLR的需要。现在ref参数可以是输入和输出;因此,CLR不知道这些out参数仅用于输出,因此必须将它们放在Begin方法和End方法上。
我还是很困惑,下面是我的问题:
Q1-我们知道在方法返回之前,out
参数需要分配一个值,因此在这种情况下,在Begin方法完成后,itemsReturned
是否设置为0?设定某事物的意义是什么?你知道在现阶段它是不正确的
Q2在Begin方法中去掉out int itemsreturn
不是更简单吗
IAsyncResult BeginGetResults(int page,
int pageSize,
AsyncCallback callback,
object state);
我们仍然可以在End方法中使用
out int itemsReturned
?Q1。我同意;这似乎是一个可怕的设计想法,作者,并不是典型的任何方式;我怀疑作者没有很好地掌握公认的混乱模式,只是简单地插入了一些东西;也许他们已经在非异步方法上使用了out
API,并且希望它保持一致
问题2。是的,但我会更进一步,将返回的项目作为附加的属性放在搜索结果
上,而不是作为输出
参数放在EndGetResults上
但重点是:这不是当前/首选的异步代码编写方式;如果你刚开始,不要走这条路;我只要:
SearchResults搜索(int-page,int-pageSize);
async ValueTask SearchAsync(int page,int pageSize);
并且让
public int items在SearchResults
上返回{get;}
注意:如果您刚刚开始研究异步,坦率地说,我建议不要研究IAsyncResult
——这是一种古老的、过时的异步模式;现在比较流行的习惯用法是async
,也就是[Value]Task[]
@marcGravel是的,我只需要先学习basic,就可以拥有构建块。很快就要学习任务了不,这不是“基础优先”的问题;IAsyncResult
没有什么“基本的”—它极其复杂和微妙,坦率地说,这两种方法之间几乎没有交叉点;学习IAsyncResult
不会帮助您了解任务
;如果有什么区别的话,它只会给一个已经令人困惑的话题增添困惑;在我看来:除非你绝对需要(因为你使用的是一个无法更新的古老系统),否则根本不要查看IAsyncResult
来增加它;旧的IAsyncResult
非常复杂,因为支持基于任务的异步的语言和运行时特性不存在;现代异步的全部要点是使这个主题变得容易理解;再次重申:IAsyncResult
不是现代异步的“积木”,就像学习如何骑马、驯马和喂马不是驾驶汽车的积木一样;在汽车出现之前,这些都是常客必备的技能