将PropertyChangedCallback标记为异步安全吗?

4

我有一个依赖属性在一个类中,我们称之为“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文档中找不到使用异步属性回调方法的相关内容。

1个回答

6
从你展示的内容来看,这看起来非常安全。
“PropertyChangedCallback”不返回任何东西(void)。框架将作为“Fire-And-Forget”方法调用此方法。
因此,调用可能会导致稍后回发到用户界面线程的某些内容是可以的,并且不会直接影响此更改通知的流程。
如果存在多个线程,并且一个线程正在等待另一个线程持有的资源,反之亦然,则会发生死锁。取决于“AsynchronousCall”所做的操作,您的系统中仍可能存在死锁,但这不是由于您的“SomethingSet”实现引起的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接