繁体   English   中英

InvokeAsync 顺序

[英]InvokeAsync order

我有不同的情况,而不是在这个问题中,因此是另一个问题。

让我们以下面的例子为例:

void PerformanceCriticalMethod()
{
    Dispatcher.Invoke(() => Log.Add("1"));
    ... some job
    Dispatcher.Invoke(() => Log.Add("2"));
}

Invoke会产生性能问题。 在尝试修复它时,我使用InvokeAsync代替Invoke并且它似乎可以工作,但重要的是21之后输出。

我可以假设如果两个InvokeAsync从同一个线程调用,它们将以相同的顺序执行吗? 我的winapi 的坚果告诉我这是真的,但我想确定。

另一个相关问题与链接问题相同:如果通过来自不同线程的InvokeAsync操作调用相同的方法,那么对于较早调用InvokeAsync线程来说,首先执行它的机会有InvokeAsync

PS:我觉得问题应该改写为“InvokeAsync 是如何工作的”,但“订单”这个词可能 100% 是人们(包括我)将尝试搜索的内容。

Dispatcher.InvokeAsync()返回一个DispatcherOperation对象。 它有一个属性Task

获取代表当前操作的 T:System.Threading.Task。

您可以使用Task支持的所有操作。 例如,继续第二个调度员调用。

Dispatcher.InvokeAsync(() => Log.Add("1")).Task.ContinueWith(() => {
    Dispatcher.InvokeAsync(() => Log.Add("2"));
});

由于尤瓦Itzchakov说,如果你只是想为了执行它们,你可以awaitInvokeAsync通话,因为DispatcherOperationawaitable (因为它暴露了一个GetAwaiter方法)。

我可以假设如果两个 InvokeAsync 从同一个线程调用,它们将以相同的顺序执行吗?

我永远不会依赖于对底层系统的假设。 它使系统变得脆弱(您永远不会真正知道该假设是否(仍然)正确)。

请查看http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/Threading/Dispatcher.cs,1045

当您调用 InvokeAsync 时,会将一个操作放入 PriorityQueue,因此我想如果您调用多个具有相同优先级的操作,您可以确信这些操作将以相同的顺序执行。

Dispatcher.InvokeAsync返回一个DispatcherOperation ,它是一个可等待的(它公开了一个GetAwaiter方法)。 如果您想保证执行顺序,您可以按照所需的顺序await它们:

async Task PerformanceCriticalMethodAsync()
{
    await Dispatcher.InvokeAsync(() => Log.Add("1"));
    ... some job
    await Dispatcher.InvokeAsync(() => Log.Add("2"));
}

我给自己下了一个结论:

首先调用InvokeAsync将首先获得其操作服务。

它与正常的async方法不确定性“谁先运行” InvokeAsync ,因为InvokeAsync实现是一个纯线程安全的生产者/消费者队列(可以在源代码中看到,感谢@olegk 的回答)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM