我正在主線程上執行一些繁重的計算,並且這些計算無法在單獨的線程上運行。使用後臺線程顯示「Busy Indicator」
我想上的應用程序的用戶界面顯示一個「忙指示符」(即,紡絲插件)時這些計算都在運行。因此,我無法在主線程上顯示忙碌指示符,因爲在這些計算運行時UI被鎖定。
要解決這個問題,我想移動繁忙指示器單獨的線程。在this post的幫助下,我可以將忙指標放在單獨的線程上。但是,我無法與此線程通信以啓動或停止繁忙指示器。
private HostVisual CreateBusyIndicatorOnWorkerThread()
{
// Create the HostVisual that will "contain" the VisualTarget
// on the worker thread.
HostVisual hostVisual = new HostVisual();
Thread thread = new Thread(new ParameterizedThreadStart(BusyIndicatorWorkerThread));
thread.ApartmentState = ApartmentState.STA;
thread.IsBackground = true;
thread.Start(hostVisual);
// Wait for the worker thread to spin up and create the VisualTarget.
s_event.WaitOne();
return hostVisual;
}
private static AutoResetEvent s_event = new AutoResetEvent(false);
private void BusyIndicatorWorkerThread(object arg)
{
// Create the VisualTargetPresentationSource and then signal the
// calling thread, so that it can continue without waiting for us.
HostVisual hostVisual = (HostVisual)arg;
VisualTargetPresentationSource visualTargetPS = new VisualTargetPresentationSource(hostVisual);
s_event.Set();
// Create a MediaElement and use it as the root visual for the
// VisualTarget.
visualTargetPS.RootVisual = CreateBusyIndicator();
// Run a dispatcher for this worker thread. This is the central
// processing loop for WPF.
System.Windows.Threading.Dispatcher.Run();
}
private FrameworkElement CreateBusyIndicator()
{
var busyIndicator = new MyBusyIndicator();
//busyIndicator.DataContext = this.
Binding myBinding = new Binding("IsBusy");
myBinding.Source = this;
busyIndicator.SetBinding(MyBusyIndicator.IsBusyProperty, myBinding);
}
我總是得到一個異常「因爲不同的線程擁有它調用線程不能訪問該對象」。這是因爲我正嘗試從主線程更新繁忙指示符,而繁忙指示符由另一個線程擁有。
我也試圖在this article給出的方法,
private void CreateAndShowContent()
{
Dispatcher = Dispatcher.CurrentDispatcher;
VisualTargetPresentationSource source =
new VisualTargetPresentationSource(_hostVisual);
_sync.Set();
source.RootVisual = _createContent();
DesiredSize = source.DesiredSize;
_invalidateMeasure();
Dispatcher.Run();
source.Dispose();
}
但是這種方法Dispatcher.Run()沒有任何反應,直到計算完成後,然後顯示繁忙指示器。
我想從主線程進行通信,以具有繁忙指示符的線程。有沒有人有辦法?
請提供一個原因,爲什麼這些操作無法在任何其他線程上運行,然後在UI線程?我沒有看到任何實際的原因。 – ElGauchooo
而不是在UI線程中執行非UI工作並在非UI線程中執行UI工作,將其逆轉。您的用戶界面是否在UI線程中工作,您的非UI工作是否在非UI線程中工作?這只是您使用的整個系統的設計。 – Servy
我正在使用第三方庫進行計算並檢查調用者線程是否是主線程。所以我們不能改變他們的實現,所以我們必須在不同的線程上做我們的UI。 – Ahmed