考慮代碼:爲什麼WPF的Dispatcher.Invoke在主線程上運行時不會導致死鎖?
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
//System.Threading.Thread.CurrentThread = button.Dispatcher.Thread
button.Dispatcher.Invoke(() => button.Content = "1234");
}
}
當然,button_Click
在主線程上運行。
我的理解是button.Dispatcher.Thread
是主線程,Invoke()
只有在線程未被阻塞時纔會被處理。但是,在這種情況下是不是主線程被阻塞?即主線程正在等待Dispatcher.Invoke()
調用完成,Dispatcher.Invoke()
正在等待主線程釋放。所以我期望在這裏陷入僵局,但它並沒有陷入僵局。
爲什麼?
P.S:我知道在這種情況下,我不需要Dispatcher.Invoke
,我可以直接撥打button.Content = "1234"
。我想了解爲什麼在這種情況下死鎖不會發生。
你不需要該調度程序。正如你所說,你在使用ui線程;只需使用button.Content =「1234」; – GCamel
@GCamel是的,我知道這一點。我試圖理解,爲什麼當我做dispatcher.Invoke(..) –
時不會發生死鎖,所以實際上,你問一個問題,而不是一個解決方案...? WPF非常好...案例看起來很正常:你的button_click運行並將代理推送到你的應用程序的處理管道 – GCamel