“跨线程操作无效”

时间:2015-07-30 01:16:36

标签: c# multithreading winforms user-interface

因此,每当我尝试为执行某些涉及UI控件的操作的函数创建新线程时,我就会遇到这个令人沮丧的问题。

所有我需要的是能够在按下GUI中的按钮时突破这个循环但是没有发生因为按钮在此方法执行完毕之前没有响应。是否有可能只是在一个单独的线程上运行该按钮,并使其更改易变量或类似的东西(一个简单优雅的解决方案),而不必修改此方法中的每一件事。

我已经阅读了上一个问题的大部分内容并尝试过一些东西,但它似乎永远不会奏效。我不明白为什么这么直观的东西很难实现。

这是我所指的功能:

private void pbPlay_MouseDown(object sender, MouseEventArgs e)
{
    pbPlay.Image = Resources.play_d;
    //playBack();
    T3 = new Thread(playBack); T3.Start();
}

private void playBack()
{
    var frameTime = new DateTime(); var frameTime_ = new DateTime();
    int playTime = 0; ;
    trPlay.BeginInvoke(new Action(() =>
        {
            playTime = trPlay.Value;
        }));

    playGoStop = true;

    lbPlayTime.BeginInvoke(new Action(() =>
        {
            lbPlayTime.Text = (playTime * numDtStepSize.Value).ToString();
        }));


    while (playTime < trPlay.Maximum + 1)
    {
        frameTime = DateTime.UtcNow;
        if ((frameTime - frameTime_).TotalMilliseconds > (double)(1000 / numFps.Value))
        {
            //systemUpdate(playTime);
            //trPlay.Value = playTime;
            //trPlay.Update();
            lbPlayTime.BeginInvoke(new Action(() =>
                {
                    lbPlayTime.Update();
                }));

            frameTime_ = frameTime;
            playTime++;
        }
        if (!playGoStop) break;
    }
}

所以BeginInvoke我在其他一些线程中阅读之后添加了它但是它不起作用并且它一直在崩溃。在这个函数中发生了一系列的GUI操作,包括get和set,我希望有一种方法可以处理这个,而不必为每一个操作都经历这么多的箍。

在这种特殊情况下,我在一个单独的线程上运行此函数,因为我需要我的UI在函数执行时保持响应,我需要能够在单击时更改变量playGoStop执行此代码时暂停按钮。

0 个答案:

没有答案