what each enum does上有定义的文档。但是我如何在实践中演示/查看呢?我怎么可能知道何时使用哪个优先级?

这是我创建的一些代码,试图查看优先级如何影响顺序,它为我提供了顺序正确的证明(第一次循环迭代将向调度队列中添加SystemIdle枚举),但是仍然可以添加到最后一个字符串

private void btn_Click(object sender, RoutedEventArgs e)
    {
        StringBuilder result = new StringBuilder();
        new Thread(() =>
            {

                var vals = Enum.GetValues(typeof(DispatcherPriority)).Cast<DispatcherPriority>().Where(y => y >= 0).ToList();
                vals.Reverse();
                vals.ForEach(x =>
                    {
                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            result.AppendLine(string.Format("Priority: {0} Enum:{1}", ((int)x), x.ToString()));
                        }), x);
                    });


            }).Start();

        ShowResultAsync(result, 2000);
    }

    private async void ShowResultAsync(StringBuilder s, int delay)
    {
        await Task.Delay(delay);
        MessageBox.Show(s.ToString());
    }

c# - 了解WPF中提供的DispatcherPriority枚举的真实行为-LMLPHP

即使列表颠倒了,输出顺序也保持不变(在分配了vals之后立即添加此行):
vals.Reverse();

因此,再一次确定我应该分配的调度优先级时,我还能使用更多的东西吗?

最佳答案

Prism Framework中,包装DefaultDispatcherDispatcher使用Normal优先级。对于几乎所有应用程序场景而言,这都是最重要的。

/// <summary>
/// Wraps the Application Dispatcher.
/// </summary>
public class DefaultDispatcher : IDispatcherFacade
{
    /// <summary>
    /// Forwards the BeginInvoke to the current application's <see cref="Dispatcher"/>.
    /// </summary>
    /// <param name="method">Method to be invoked.</param>
    /// <param name="arg">Arguments to pass to the invoked method.</param>
    public void BeginInvoke(Delegate method, object arg)
    {
        if (Application.Current != null)
        {
            Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, method, arg);
        }
    }
}

只要您不在UI线程上运行任何实际的逻辑,我建议您这样做。

如果您出于某种原因想要在UI线程上运行“快速”逻辑,则可以遵循建议here并坚持使用Background的值。

我做了一点研究,并在NuGet's source中发现了一些用法,出于各种原因它们在其中使用SendNormalBackgroundApplicationIdle,但是在我的WPF开发中,我从来没有必要将DispatcherPriority的用法微调到这个程度。

关于c# - 了解WPF中提供的DispatcherPriority枚举的真实行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33701510/

10-12 21:50