Убедитесь, что все вызовы в службе выполнены на Stathread [Duplicate]C#

Место общения программистов C#
Ответить
Anonymous
 Убедитесь, что все вызовы в службе выполнены на Stathread [Duplicate]

Сообщение Anonymous »

У меня есть проблема, связанная с Stathread, в приложении WPEMODEL-первого WPF.
Существует Windowservice Singleton, который управляет всеми видами, связанными с окном/UI (например, отображение диалоговых окнов, открытие новых Windows), которое передается через модели View. PrettyPrint-Override ">

Код: Выделить всё

public MyViewModel(IWindowService windowService)
{
this.windowService = windowService;
}

public void Close()
{
this.OnRequestClose?.Invoke(this, new EventArgs());
}
и Windowservice это похоже на это:

Код: Выделить всё

public void Open(IViewModel viewModel)
{
Window win = new(viewModel); //This is a window that inherits from Window but has a parameter to take a datacontext

viewModel.OnRequestClose += (s, e) =>
{
win.Close();
};

win.Show();
}

public void ShowMessageDialog(string title, string message)
{
MessageDialogViewModel dialog = new(message);

this.ShowDialog(title, dialog);
}

public void ShowDialog(string title, T viewModel) where T : ICloseable
{
Window window = new()
{
Title = title,
Content = viewModel,
};

viewModel.OnRequestClose += (s, e) =>
{
window.Close();
};

window.ShowDialog();
}
< /code>
Теперь все это работает, за исключением случаев, когда у меня есть делегат действия, который называется, например, Это уведомление от SignalR (в ViewModel): < /p>
connection.On("Completed", () =>
{
this.windowService.ShowMessageDialog("Completed", "Completed");
this.Close();
});
< /code>
, которые будут выносить следующие ошибки: < /p>
System.InvalidOperationException: 'The calling thread must be STA, because many UI components require this.'
- это происходит на this.windowservice.showmessagegageAlage («завершено», «завершено»); call.
Если я прокомментирую это, следующая строка this.close (); вместо этого бросит это:

Код: Выделить всё

System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'

Так что я ясно получил беспорядок из потоков, и я обнаружил, что использует Dispatcher.currentDispatcher или аннотирование методов с [Stathread] ничего не исправляет.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -stathread
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»