如果我有至少2个班级。一个类创建Bitmap,另一个类在UI表单上绘制位图。我想问你是否有任何变量我可以从UIClass传输到GeneratorClass,除了整个Form或任何控件。我更喜欢将“Thread”作为属性从UIClass传输到GeneratorClass,而在GeneratorClass中,我可以通过在UIThread中调用来创建图像。
我知道:
Control.Invoke(Delegate, Parameters)
或者在WPF中
Control.Dispatcher(Delegate, Parameters)
我也知道
System.Threading.Thread(ThreadStart)
我更喜欢只使用“线程变量”来启动调用或使用Dispatcher来保持WPF和WinForms以及具有相同线程的GeneratorClass。
感谢您的想法(首选VB.Net)
*我的工作答案*
使用共享Threading.SynchronizationContext.Current
接收当前的UI线程。然后用
GuiThread.Send(AddressOf MyMethode, MyParameters)
在UI线程中工作。
Private Sub CreateTestImage()
'This methode is needed to work in Ui Thread
Dim SyncContext As Threading.SynchronizationContext = Threading.SynchronizationContext.Current 'Read current UI Thread and store it to variable
If Me._UseMultiThreading = True Then
'call methode WITH multthreading
Dim ThS As New Threading.ParameterizedThreadStart(AddressOf CreateTestImageAsync)
Dim Th As New Threading.Thread(ThS)
Th.SetApartmentState(Threading.ApartmentState.STA)
Th.Start(SyncContext)
Else
'call methode WITHOUT multthreading
Call CreateTestImageAsync(SyncContext)
End If
End Sub
线程中的Methode:
Private Sub CreateTestImageAsync(ByVal obj As Object)
'Callback is only supporting As Object.
'Cast it back the the SynchronizationContext
Dim GuiThread As Threading.SynchronizationContext = CType(obj, Threading.SynchronizationContext)
'Do some stuff
GuiThread.Send(AddressOf ImageCreated, ImgInfo) 'Call methode in UI thread
End Sub
答案 0 :(得分:2)
您可以将当前SynchronizationContext
传递给该主题。
在你的线程中,它看起来像这样:
void ThreadMethod(object parameter)
{
var context = (SynchronizationContext)parameter;
context.Send((s) => TheMethodYouWantToRunOnTheUiThread(), null);
}
你会像这样开始你的线程:
var newThread = new Thread(ThreadMethod);
newThread.Start(SynchronizationContext.Current);
它在C#中,但我认为你可以翻译它。
BTW:这是BackgroundWorker
class用于将事件ProgressChanged
和Completed
封送到UI线程的机制。有关此主题的更多信息,请参阅here