Может ли BackgroundWorker присоединиться (связать, получить доступ, вызвать, стать) STAThread

Я не очень хорошо знаком с тем, что именно делает (является) STAThread, поэтому я не уверен, правильно ли сформулирован мой вопрос.

У меня есть процесс, работающий в потоке BackgroundWorker, который копирует содержимое диапазона Excel в буфер обмена (Excel.Range.Copy()). После копирования мне нужно иметь доступ к содержимому буфера обмена, чтобы записать его в текстовый файл, но, видимо, к буферу обмена нельзя получить доступ напрямую из моего BackgroundWorker (когда я пытаюсь использовать Clipboard.GetText() из моего BackgroundWorker и записать этот текст в свой текстовый файл , текст не передается, хотя я могу вручную выполнить Ctrl-V в отдельном текстовом файле и вставить содержимое, которое только что было скопировано из диапазона Excel процессом C#).

Я также должен упомянуть, что я запускаю этот процесс в BackgroundWorker, чтобы облегчить использование ProgressBar, который показывает статус процесса. Итак, если есть решение, позволяющее мне использовать ProgressBar и получать доступ к содержимому буфера обмена без использования BackgroundWorker, я абсолютно его приветствую! Спасибо!


person sergeidave    schedule 28.01.2013    source источник
comment
Возможный дубликат stackoverflow .com/questions/7635994/. Если нет, то там есть отличное решение, связанное с вашим вопросом.   -  person villecoder    schedule 29.01.2013
comment
@villecoder: Спасибо! Я проверю это!   -  person sergeidave    schedule 29.01.2013


Ответы (1)


Вот кое-что довольно крутое и простое. Просто вызовите поток пользовательского интерфейса, предполагая, что ваш проект основан на WinForms, после чего вы сможете взаимодействовать с продуктами Microsoft. В нашем случае мы использовали Outlook, но Excel работает и так:

BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(this.bgw_DoWork);
bgw.RunWorkerAsync();

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    // Invoke the UI thread
    // "this" refering to the Form1, or what ever your form is
    this.Invoke((MethodInvoker)delegate
    {
        MsOutlook.ApplicationClass OutlookApplication = new MsOutlook.ApplicationClass();
        // do whatever here ... etc etc

    }
}
person Conrad de Wet    schedule 12.08.2013