Пока я рефакторинг некоторые старые C# код для создания документов с Office.Interop
библиотекой я нашел это и из-за этого использует контекст пользовательского интерфейса, когда функция была вызваны из него блокировали егоTask.Run из UI нити бросает ошибку STA
Пример
private void btnFooClick(object sender, EventArgs e)
{
bool documentGenerated = chckBox.Checked ? updateDoc() : newDoc();
if(documentGenerated){
//do something
}
}
решил изменить его так, чтобы уменьшить от блокировки UI
private async void btnFooClick(object sender, EventArgs e)
{
bool documentGenerated; = chckBox.Checked ? updateDoc() : newDoc();
if(chckBox.Checked)
{
documentGenerated = await Task.Run(() => updateDoc()).ConfigureAwait(false);
}
else
{
documentGenerated = await Task.Run(() => newDoc()).ConfigureAwait(false);
}
if(documentGenerated){
//do something
}
}
И это было бросать такую ошибку
Текущий поток должен быть установлен в режим одного потока квартиры (STA) перед тем OLE вызовы могут быть сделаны
Почему это происходит и что можно решить эту проблему?
Вы делаете что-то в updateDoc(), что вы никогда не должны делать из рабочего потока. Мы не можем этого видеть. Ничего общего с интернетом Office, судя из сообщения об исключении, вы используете буфер обмена или диалог оболочки, такой как OpenFileDialog. Не делай этого. И имейте в виду, что код взаимодействия работает в потоке пользовательского интерфейса в любом случае, COM сохраняет его поточно-безопасным автоматически, поэтому вы, вероятно, не впереди. –
@ HansPassant хорошо, да, видел, что 'MessageBox' вызывает не менее – DanilGholtsman
@ HansPassant haha, и там тоже используется буфер обмена. Получил 3,5 года опыта разработки, понятия не имел о таких проблемах и немного испугался. – DanilGholtsman