Windows runtime 在WinRT中同步执行UI线程上的操作

Windows runtime 在WinRT中同步执行UI线程上的操作,windows-runtime,Windows Runtime,我正在开发一些corss平台库,需要在UI线程上执行一个操作。 虽然我知道有一个方法Dispatcher.RunAsync可以在UI线程上执行操作,但它是异步的,我不能使用wait/async特性,因为代码是corss平台,我不希望库绑定到.net 4.5的wait/async特性 有没有办法在UI线程上同步执行操作 如果您从UI线程执行它,那就感谢您了-没有办法执行它。例如,在后台线程中,您可以使用在调用RunAsync并从RunAsync回调设置它之后等待的AutoResetEvent来执行

我正在开发一些corss平台库,需要在UI线程上执行一个操作。 虽然我知道有一个方法Dispatcher.RunAsync可以在UI线程上执行操作,但它是异步的,我不能使用wait/async特性,因为代码是corss平台,我不希望库绑定到.net 4.5的wait/async特性

有没有办法在UI线程上同步执行操作


如果您从UI线程执行它,那就感谢您了-没有办法执行它。例如,在后台线程中,您可以使用在调用RunAsync并从RunAsync回调设置它之后等待的AutoResetEvent来执行此操作。

如果从UI线程执行,则无法执行此操作。例如,在后台线程中,您可以使用在调用RunAsync并从RunAsync回调设置它之后等待的AutoResetEvent来执行此操作。

跨平台库不应依赖于特定的UI(例如,
Dispatcher
CoreDispatcher
)。有一种类型表示抽象的“上下文”:
SynchronizationContext
;不久前我写了一篇关于这个主题的文章


如果您的库可以在需要使用UI上下文之前捕获它,那么您可以捕获
SynchronizationContext.Current
,然后使用
Send
在原始上下文上同步执行一些代码。

跨平台库不应依赖于特定的UI(例如,
Dispatcher
CoreDispatcher
)。有一种类型表示抽象的“上下文”:
SynchronizationContext
;我不久前写了一篇关于这个主题的文章


如果您的库可以在需要使用UI上下文之前捕获它,那么您可以捕获
SynchronizationContext.Current
,然后使用
Send
在原始上下文上同步执行一些代码。

谢谢。如果使用AutoResetEvent,它是否与任务类似。Wait()?如果这是真的,可能会导致死锁。是的,可能会,不过,因为您将从后台线程运行它,而dispatcher位于UI线程上-这会稍微降低风险。不过,嘿,我不推荐这样做。:)谢谢。如果使用AutoResteEvent,它是否与Task.Wait()类似?如果这是真的,可能会导致死锁。是的,可能会,但是,因为您将从后台线程运行它,而dispatcher位于UI线程上-这稍微降低了风险。不过,无论如何,嘿,我不推荐它非常感谢你!这篇文章给了我很多知识。可移植类库不应该依赖于dispatcher,这是正确的。这就是为什么我需要在UI线程同步上执行,因为在可移植的类库中,我定义了一个接口,它有一个名为“ExecuteonuThread”的方法,它接受Func并返回T1,因为这是可移植的类库,所以我不能定义ExecuteonuThreadAsync,当我在不同的平台上实现这个推断时,例如wpf,单机器人,没问题。但对于温特,我不能。我尝试使用“等待”,但有时会出现死锁。抱歉,WinRT中不提供“发送”。还有其他想法吗?@Draire1:最好的选择是首先不要进入这个场景:构建您的库,使其充当UI的服务。理想情况下,一个库甚至不应该意识到有一个UI。Stephen,我大体上同意你的说法,但是,正如其他海报所观察到的,这使得琐碎的任务变成了复杂的工程壮举。您可以在异步版本上使用“等待”来完成同样的事情,但更大的问题是死锁。我能够解决我的问题,这涉及从异步调用加载位图流,然后从中创建位图图像,但我不想再次访问这些代码。@Draire1:我不同意这是一项复杂的工程壮举。将逻辑与UI分离会使代码更清晰,关注点的分离度更高<代码>位图是一种尴尬的情况,因为它与UI绑定在一起,不应该这样。非常感谢!这篇文章给了我很多知识。可移植类库不应该依赖于dispatcher,这是正确的。这就是为什么我需要在UI线程同步上执行,因为在可移植的类库中,我定义了一个接口,它有一个名为“ExecuteonuThread”的方法,它接受Func并返回T1,因为这是可移植的类库,所以我不能定义ExecuteonuThreadAsync,当我在不同的平台上实现这个推断时,例如wpf,单机器人,没问题。但对于温特,我不能。我尝试使用“等待”,但有时会出现死锁。抱歉,WinRT中不提供“发送”。还有其他想法吗?@Draire1:最好的选择是首先不要进入这个场景:构建您的库,使其充当UI的服务。理想情况下,一个库甚至不应该意识到有一个UI。Stephen,我大体上同意你的说法,但是,正如其他海报所观察到的,这使得琐碎的任务变成了复杂的工程壮举。您可以在异步版本上使用“等待”来完成同样的事情,但更大的问题是死锁。我能够解决我的问题,这涉及从异步调用加载位图流,然后从中创建位图图像,但我不想再次访问这些代码。@Draire1:我不同意这是一项复杂的工程壮举。将逻辑与UI分离会使代码更清晰,关注点的分离度更高<代码>位图是一种尴尬的情况,因为它与UI绑定在一起,不应该这样做。