单击子窗口中未触发的事件处理程序

时间:2014-10-15 00:31:30

标签: wpf multithreading

在我第一次涉及(相对简单的)多线程WPF应用程序时,我遇到了一个问题,试图在一个线程上运行一个计时器并在另一个线程的子窗口中记录点击事件。单独线程上的计时器代码运行正常,但我在其他窗口中使用按钮事件处理程序尝试的所有操作都会导致零点击事件被识别。

MainWindow.xaml.cs:

public static bool isCompleted = false;

public void DoSomething()
{
    TestWindow testWindow = new TestWindow(testID);
    testWindow.Owner = this;
    testWindow.Show();

    Thread timerThread = new Thread(RunTestTimer);
    timerThread.Start();

    do
    {
    } while (!isCompleted);

    // Some code to execute when the timer thread is done
}

...

public void RunTestTimer() { ... some stuff here, runs fine... }

TestWindow.xaml:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Button Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="0" Grid.RowSpan="3" 
        Background="White" Name="btnRespond"/>
</Grid>

TestWindow.xaml.cs:

public static Test Test;

public TestWindow(int testID)
{
    InitializeComponent();

    btnRespond.Click += btnRespond_Click;
    btnRespond.Visibility = Visibility.Visible;

    Test = new Test()
    {
        TestID = testID
    };

    Test.Responses = new List<Response>();
    Test.StartedAt = DateTime.UtcNow;
}

internal void btnRespond_Click(object sender, RoutedEventArgs e)
{
    Test.Responses.Add(new Response()
        {
            TestID = Test.TestID,
            RespondedAt = DateTime.UtcNow
        });
}

Test.Responses始终为空。为什么?我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我明白了。基本上,UI线程正在处理我正在使用的循环,以防止执行后面的代码,直到线程的操作完成,因此,因为UI线程在MainWindow中忙,所以点击事件不是&#39;可以在子窗口中触发。

我通过使用BackgroundWorker类来修复此问题,并为RunWorkCompleted事件提供回调,以执行我试图延迟直到完成单独线程的代码。由于这篇文章:Threading with Callback example does not work.

,这就像一个魅力

你活着,你学习。