Я знаю, что здесь уже есть ответ, и то, что Слэкс дал вам, исправит его, поскольку он будет использовать поток Dispatcher, поэтому не будет выдавать исключение для accessing a control from a different thread
.
Но я замечаю это.
backgroundDBTask = Task.Factory.StartNew(() =>
{
DoSomething1();
}, TaskCreationOptions.LongRunning);
С этим
backgroundDBTask.ContinueWith((t) =>
{
// ... UI update work here ...
},
TaskScheduler.FromCurrentSynchronizationContext());
У вас уже есть комментарий, где обновить пользовательский интерфейс, и вы также дали ему SynchronizationContext
.Почему вы все еще пытаетесь обновить UI
внутри вашего DoSomething1
?
Если ваша цель Task
не состоит в том, чтобы обновить UI
, тогда нет необходимости использовать ContinueWith
.Вместо этого просто передайте SynchronizationContext
, и он должен работать без явного вызова Dispatcher.BeginInvoke
.
backgroundDBTask = Task.Factory.StartNew(() =>
{
DoSomething1();
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());