睡眠方法无法正常工作

use*_*478 0 c# winforms

好的,我有一个棋盘应用程序.该应用程序在一个组框中有64个面板.这些面板用表达式CHessBoardPanels {x,y)标识.我用它来改变面板的背景颜色.我想在chessPanel.BackGround变为红色和面板变回白色之间有一个小的延迟.(大约1到2秒的延迟)我尝试过睡眠功能,但它基本上锁定了应用程序直到任务已经完成完成

这是我尝试过的代码:

for (int Row = 7; Row > 3; --Row)
{
    chessBoardPanels[ Column ,Row].BackColor = Color.Red;
    ++Column;
    //Add text to Moves TextBox
    MovesText.AppendFormat("WhtB {0} {1}{2}", ColumnText, RowText, Environment.NewLine);
    MovesTxt.Text = MovesText.ToString();
    ++ColumnText;
    --RowText;
}

//Start White Horizonal Drill
Column = 0;
Thread.Sleep(5000);             //This does not delay proerperly
for (int Row = 7; Row > 4; --Row)
{
    chessBoardPanels[Column, Row].BackColor = Color.White;
    ++Column;
    //Add text to Moves TextBox
    MovesText.AppendFormat("WhtB {0} {1}{2}", ColumnText, RowText, Environment.NewLine);
    MovesTxt.Text = MovesText.ToString();
    ++ColumnText;
    --RowText;
} 
Run Code Online (Sandbox Code Playgroud)

我正在使用.Net framework 4.0,因为Visual Studio 2010不支持4.5

Roy*_*tus 5

这就是睡眠所做的,它会暂停线程.

你需要的是使用一个Timer控件,并创建一个颜色变化的队列,让定时器控件定期调用一个事件处理程序,如下所示:

(在你的Form类中):

Timer timer = new Timer();
Run Code Online (Sandbox Code Playgroud)

(在你的Form的构造函数中):

timer.Tick += new EventHandler(timer_Tick);
timer.Interval = 500; // every 1/2 second
timer.Enabled = true;
timer.Start();
Run Code Online (Sandbox Code Playgroud)

然后您的事件处理程序将执行以下操作:

void timer_Tick(object sender, EventArgs e)
{
    // Read a queue, that contains timings
    var nextItem = PeekAtQueue();
    if ((nextItem != null) && (nextItem.WhenToChangeColor <= DateTime.Now))
    {
        var item = TakeFromQueue(); // as opposed to just peeking
        ChangeColor(item);
    }
} 
Run Code Online (Sandbox Code Playgroud)

这是做什么的?(当然这段代码不是100%完整,你必须自己添加队列访问方法,这取决于你想要/可以使用的内容)

  • 看到Sleep()暂时冻结了你的应用程序,你需要一个解决方案,让你仍然可以与你的表单进行交互,同时仍然有延迟并在延迟后做一些事情.
  • 因此,您需要使用计时器在以后执行某些操作.此示例中的计时器每1/2秒执行一次,但您可以使用您选择的任何间隔.
  • 点是,由于这个计时器和这个配置,某个方法 - 事件处理程序 - 每1/2秒执行一次,或者你选择的间隔.
  • 因此,您可以做的是,当您希望稍后发生某种颜色更改时,例如,对描述颜色更改的对象进行排队{E5, "red", today at 04:20:30 PM}.
  • 计时器执行的事件处理程序每​​次查看队列中是否有东西,并查看它是什么.它检查排队对象中描述的"改变颜色的时刻"现在或已经过了.如果是这样,它会改变颜色.如果没有,它将项目留在队列的顶部,并且下次再次执行事件处理程序(1/2秒后),它将再次执行相同的检查.
  • 完成颜色更改后,对象将从队列中删除.