0

我想知道是否可以仅根据 Windows Phone 开发中的静态分析,从源代码中了解哪些代码片段在 UI 上执行。

我尝试实现一个静态分析,找出不必要地使用 Dispatcher.(Begin)Invoke 的地方。

这些是 UI 线程肯定执行的地方:

  • 将“RoutedEventArgs”作为参数的事件处理程序
  • UI 元素的构造函数
  • 上述方法中方法调用的定义(意味着传递查看这些事件处理程序方法和 UI 构造函数的调用图)

上面的列表还有其他地方吗?或者有什么问题吗?

4

2 回答 2

0

使用 Dispatcher 或正确的 SynchronizationContext 调用的每个方法都将在 UI 线程上执行。这使得详尽的静态分析变得不可能。例如,WebClient 类的回调在 UI 线程上执行。你应该如何预测那些极端情况?

一个快速提示,非常有用的是您有一个可以从 UI 或非 UI 线程调用的方法。通过调用方法Dispatcher.CheckAccess()(Visual Studio中的intellisense没有显示这个方法,所以很难发现),你可以知道是否需要调用Dispatcher:

if (Dispatcher.CheckAccess())
{
    // In the UI thread
    SomeMethod();
}
else
{
    // Not in the UI thread
    Dispatcher.BeginInvoke(SomeMethod);
}

从那里,您可以编写一个包装器:

public void CallDispatcherIfNeeded(Action method) // You might want a shorter name
{
    if (Dispatcher.CheckAccess())
    {
        // In the UI thread
        method();
    }
    else
    {
        // Not in the UI thread
        Dispatcher.BeginInvoke(method);
    }
}

然后你只需要调用它,而不用担心你是否在 UI 线程上:

CallDispatcherIfNeeded(SomeMethod);

也就是说,如果您的代码编写正确,那么很少需要这种技巧。

于 2013-08-24T22:09:20.370 回答
0

我会看看何时真正需要 Dispatcher.BeginInvoke,而不是相反。

几乎从不需要它,除非处理可能在后台线程上开始的异步完成事件,因此如果你想对 UI 做一些事情,你需要将它编组到 UI 线程。

换句话说,除非您需要从后台线程对 UI 执行某些操作,否则您不需要它。

格雷格

于 2013-08-25T12:17:43.627 回答