我们正在开发一个在UWP(前端)和REST-MVC-IIS(后端)中开发的项目。UWP + IIS +异步行为
我想上可能引发了理论场景:
据我所知,有没有办法保证其请求将被处理和IIS服务的顺序。
因此,在一个简单的场景,让我们姑且这样的:
UI:
的SelectionChanged(productId参数= 1);
SelectionChanged(productId = 2);
private async void SelectionChanged(int productId)
{
await GetProductDataAsync(productId);
}
IIS:
GetProductDataAsync(productId=1) scheduled on thread pool
GetProductDataAsync(productId=2) scheduled on thread pool
GetProductDataAsync(productId=2) finishes first => send response to client
GetProductDataAsync(productId=1) finishes later => send response to client
正如你所看到的,对于productId=2
要求无论出于何种原因更快地完成然后productId=1
的第一个请求。
由于异步工作的方式,两个通话将建立一个关于这将覆盖对方,如果他们不按照正确的顺序来,因为它们含有相同的数据的UI两种续任务。
这可以外推到几乎任何master-detail场景,在这种情况下,最终可能会选择主项目并获取错误的细节(因为响应从IIS返回的顺序)。
我想知道的是,是否有一些最佳实践来处理这种情况......很多解决方案都浮现在脑海中,但我不想在试图实施之前跳过枪并执行一次实施看看桌上还有什么其他选项。
两个UI叫你展示;是他们字面上的两行代码一个跟着另一个?如果是这样,第二行在第一行完成之前不会开始执行,并且整个往返IIS的操作都已完成。 – sellotape
那么,你错过了连续两次调用中使用的异步,这会改变一切,因为它们不会被顺序处理,而是并行处理。这并不是说并行,但这两个调用的结果稍后将在两个调用的延续任务中处理,这意味着返回的第一个调用将被首先处理,因此如果第二个请求首先结束(无论出于何种原因)那么最终会出现上述情况,其中稍后的调用将覆盖先前调用的结果。 –
如果这2条UI线是连续的,它们将不会并行处理。等待意味着:等到通话结束后再继续下一行。执行可能会继续执行调用方法,但在当前方法中不会继续执行,直到等待完成的任务完成。 – sellotape