将 PropertyChangedCallback 标记为异步是否安全?
Is it safe to mark a PropertyChangedCallback asynchronous?
我对 class 有依赖关系 属性,我们称它为 'SomethingControl':
public static readonly DependencyProperty SomethingProperty = DependencyProperty.Register("Something", typeof(Something), typeof(SomethingControl), new UIPropertyMetadata(SomethingGotSet));
并且我已将传递给 UIPropertyMetadata 构造函数的回调方法定义为异步的:
private async static void SomethingGotSet(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (SomethingControl)d;
if (control != null)
{
control.SomeOtherProperty = await AsynchronousMethodCall();
}
}
这样做安全吗?这会导致 UI 线程出现死锁或问题吗?我已经对其进行了测试,它似乎工作正常,但我在 MSDN 文档中找不到任何使用异步 属性 回调方法的信息。
从您向我们展示的内容来看,这看起来非常安全。
PropertyChangedCallback
returns 什么都没有(无效)。该框架将调用它作为 'Fire-And-Forget' 方法。
因此,您正在调用可能导致稍后回发到用户界面线程的内容这一事实没有问题,不会直接影响此更改通知流。
如果有多个线程就会发生死锁,一个线程正在等待另一个线程持有的资源,反之亦然。根据 AsynchronousCall
的作用,系统中的某处可能仍然存在死锁,但这不会是由于您的 SomethingSet
实施。
我对 class 有依赖关系 属性,我们称它为 'SomethingControl':
public static readonly DependencyProperty SomethingProperty = DependencyProperty.Register("Something", typeof(Something), typeof(SomethingControl), new UIPropertyMetadata(SomethingGotSet));
并且我已将传递给 UIPropertyMetadata 构造函数的回调方法定义为异步的:
private async static void SomethingGotSet(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (SomethingControl)d;
if (control != null)
{
control.SomeOtherProperty = await AsynchronousMethodCall();
}
}
这样做安全吗?这会导致 UI 线程出现死锁或问题吗?我已经对其进行了测试,它似乎工作正常,但我在 MSDN 文档中找不到任何使用异步 属性 回调方法的信息。
从您向我们展示的内容来看,这看起来非常安全。
PropertyChangedCallback
returns 什么都没有(无效)。该框架将调用它作为 'Fire-And-Forget' 方法。
因此,您正在调用可能导致稍后回发到用户界面线程的内容这一事实没有问题,不会直接影响此更改通知流。
如果有多个线程就会发生死锁,一个线程正在等待另一个线程持有的资源,反之亦然。根据 AsynchronousCall
的作用,系统中的某处可能仍然存在死锁,但这不会是由于您的 SomethingSet
实施。