#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);