如何让Dispatcher.BeginInvoke在VB.net的后台运行?

时间:2013-10-01 06:27:03

标签: wpf vb.net multithreading xaml dispatcher

我需要在后台运行应用程序的某些部分,并允许用户在子窗口在后台运行时更新UI。我搜索了一下,发现在WPF中我应该使用Dispatcher。问题是即使我使用调度程序仍然我的GUI不可用,直到所有潜艇完成。我在这里附上了一个代码,这样你就可以更清楚地了解我的意思。 例如,在此代码中,当用户运行应用程序时,系统应运行一个新线程,该线程将更改第一个文本框的文本,而使用时可以更新第二个文本框的文本。 我想知道我是否正确行事。有人可以帮我吗?

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:testDispacher"
Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
<Grid>
    <StackPanel>
        <TextBlock>UCtextbox:</TextBlock>
        <src:ToBeRunByDispacherUC x:Name="UC1" />
        <TextBlock>Windowstxtbox:</TextBlock>
        <TextBox x:Name="txtBox2" Width="100" Height="30"/>
    </StackPanel>
</Grid>

Class Window1 
Delegate Sub runSub()
Dim setTxt As runSub
Public Sub New()
    InitializeComponent()
    setTxt = AddressOf UC1.setTxtBox
End Sub
Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    UC1.IsEnabled = False
    Dispatcher.Invoke(setTxt, Windows.Threading.DispatcherPriority.Background)
End Sub

结束班

<UserControl x:Class="ToBeRunByDispacherUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
    <TextBox x:Name="txtBox1" Width="100" Height="30"/>
</Grid>

Partial Public Class ToBeRunByDispacherUC

Public Sub setTxtBox()
    Dim j As Integer = 0
    For i As Integer = 0 To 10
        j += 1
        System.Threading.Thread.Sleep(1000)
    Next
    txtBox1.Text = "End"
    Me.IsEnabled = True
 End Sub
End Class

2 个答案:

答案 0 :(得分:2)

调度程序应该用于从单独的线程更新UI对象,它实际上不会为您生成线程。如果您使用的是.NET 4.0或更高版本,则可以使用TPL库生成线程,完成工作,然后通过后台线程中的调度程序更新UI对象。

Task.Factory.StartNew(Sub() DoBackgroundWork())

然后,只要你想更新你的UI,就在DoBackgroundWork内部......

Task.Factory.StartNew(Sub() DoBackgroundWork())

答案 1 :(得分:0)

你可以打电话给一般申请。

Application.Current.Dispatcher.Invoke()