Как уже упоминалось здесь , Dispatcher.Invoke
может заморозить UI. Вместо этого используйте Dispatcher.BeginInvoke
.
Вот удобный класс расширений, который упрощает проверку и вызов диспетчера вызовов.
Пример использования: (вызов из окна WPF)
this Dispatcher.InvokeIfRequired(new Action(() =>
{
logTextbox.AppendText(message);
logTextbox.ScrollToEnd();
}));
Класс расширения:
using System;
using System.Windows.Threading;
namespace WpfUtility
{
public static class DispatcherExtension
{
public static void InvokeIfRequired(this Dispatcher dispatcher, Action action)
{
if (dispatcher == null)
{
return;
}
if (!dispatcher.CheckAccess())
{
dispatcher.BeginInvoke(action, DispatcherPriority.ContextIdle);
return;
}
action();
}
}
}
EmacsWiki является большим ресурсом: EmacsWiki: управление сеансами
Похоже , Windows Mode , или более конкретно revive.el, то, что Вы хотите.