Интересно, у меня твой код работает.Возможно, вы пропустили части кода, которые могут объяснить проблему.Можете ли вы опубликовать более полное воспроизведение проблемы?В частности, покажите, что вы делаете с элементом modelChanged
, отличным от присвоения ему лямбды.
То, что я сделал, создайте пустое приложение WPF и запустите метод Init из конструктора главного окна.1004 *
Затем я запустил фоновые потоки, которые напрямую вызывали делегат modelChanged
.
Я увидел, что строка «ModelChanged on thread ...» всегда печатает правильный поток, который вызывалInit
.
Если это поможет, вот что я сделал, чтобы попытаться воспроизвести его, вы можете посмотреть на него и, возможно, написать о том, что вы делаете по-другому:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Init();
}
private EventHandler modelChanged;
protected void Init()
{
Trace.WriteLine(string.Format("ChangeManager init on thread={0}",
Thread.CurrentThread.ManagedThreadId));
var uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
modelChanged = (o, args) => Task.Factory.StartNew(() =>
{
Trace.WriteLine(string.Format("ModelChanged on thread={0}",
Thread.CurrentThread.ManagedThreadId));
if (ModelChanged != null)
{
ModelChanged(o, args);
}
},
CancellationToken.None,
TaskCreationOptions.None,
uiTaskScheduler);
}
public event EventHandler ModelChanged;
private void button1_Click(object sender, RoutedEventArgs e)
{
var t = new Thread(
obj =>
{
Trace.WriteLine(string.Format(
"Launching handler on thread={0}",
Thread.CurrentThread.ManagedThreadId));
modelChanged(null, EventArgs.Empty);
});
t.Start();
}
}