在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());
}
即使列表颠倒了,输出顺序也保持不变(在分配了
vals
之后立即添加此行):vals.Reverse();
因此,再一次确定我应该分配的调度优先级时,我还能使用更多的东西吗?
最佳答案
在Prism Framework中,包装DefaultDispatcher
的Dispatcher
使用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中发现了一些用法,出于各种原因它们在其中使用
Send
,Normal
,Background
和ApplicationIdle
,但是在我的WPF开发中,我从来没有必要将DispatcherPriority
的用法微调到这个程度。关于c# - 了解WPF中提供的DispatcherPriority枚举的真实行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33701510/