Фоновому рабочему не нравится буфер обмена

#vb.net #visual-studio-2008 #.net-3.5 #backgroundworker #clipboard

#vb.net #visual-studio-2008 #.net-3.5 #backgroundworker #буфер обмена

Вопрос:

Пример полного кода:

 Private Sub test()
    Clipboard.SetDataObject("test") '<- gives error
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    test()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
End Sub
 

Ошибка, которую я получаю, это:

 {"Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it."}
 

Я пробовал использовать

 BeginInvoke(New Action(Function() Clipboard.SetDataObject(strText.ToString)))
 

вместо

 Clipboard.SetDataObject(strText.ToString)))
 

Но получите сообщение о том, что выражение не выдает значение on.

Комментарии:

1. Просто удалите «.Dispatcher», чтобы использовать метод BeginInvoke формы.

2. @HansPassant, это исправило Dispatcher ошибку, но теперь буфер обмена выдает сообщение об ошибке Expression does not produce a value .

Ответ №1:

в части, когда вы хотите сделать копию, попробуйте:

 Private Thr As Threading.Thread
Thr = New Threading.Thread(New Threading.ThreadStart(AddressOf NewThread))
Thr.SetApartmentState(ApartmentState.STA)
Thr.Start()
 

и определить:

  Private Sub NewThread()
      Try
           Clipboard.SetDataObject(strText.ToString)

      Catch ex As Exception
           ' Log exception
      End Try
 End Sub
 

Комментарии:

1. Преобразование private void NewThread() в vb.net однако это не проблема, я не вижу, как преобразовать первую часть Thread newThread = new Thread(NewThread);