设置简单超时

Set simple timeout

我已经检查了 SO 中关于 C# 超时的其他问题,但由于我是初学者,我真的不知道如何将它们实现到我的代码中。它们看起来太精致了。

我有一个文本框,我添加了一个点击事件。单击后,用户将文本框的内容复制到剪贴板。为了让用户注意到复制过程,我更改了文本框的背景颜色。 复制内容后,我想将文本框的背景颜色改回正常。所以我需要设置一个超时时间。

private void IDBox_Click(object sender, EventArgs e)
{
    CopyToClipboard((TextBox)sender);
}

private void CopyToClipboard(TextBox textBox)
{
    if (textBox.Text != "")
    {
        textBox.BackColor = System.Drawing.Color.MistyRose;

        Clipboard.SetText(textBox.Text);

        // set 200ms timeout and then change BackColor
        //textBox.BackColor = System.Drawing.SystemColors.Window;
    }
}

如何设置超时?举个例子就好了。

使用 Timer 并在 Elapsed 事件中改回颜色。

让您入门的快速粗略(未经测试)代码:

private void CopyToClipboard(TextBox textBox)
{
    if (textBox.Text != "")
    {
        textBox.BackColor = System.Drawing.Color.MistyRose;

        Clipboard.SetText(textBox.Text);

        // Create a timer with a 1 second interval.
        System.Timers.Timer aTimer = new System.Timers.Timer(1000);

        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;

        // Only tick one time
        aTimer.AutoReset = false;

        // Start timer
        aTimer.Enabled = true;
    }
}

private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
    this.BeginInvoke((MethodInvoker)delegate
    {
        textBox.BackColor = System.Drawing.SystemColors.Window;
    });
}

不确定这是否符合您的要求(初学者?),但这将通过使用 Task调用[来完成简单的 闪烁 =16=] 延迟后文本颜色变回:

textBox.BackColor = Color.MistyRose;
Task.Run(() =>
{
    Thread.Sleep(200); // delay
    this.BeginInvoke((MethodInvoker)delegate
    {
        textBox.BackColor = SystemColors.Window;
    });
});

假设您有一个名为 test 的文本框,您可以使用 WPF 中的调度程序计时器,或者如果您使用 windows 表单,则可以使用 Windows 表单计时器。

            test.Background = new SolidColorBrush(Colors.MistyRose);

        Clipboard.SetText(test.Text);
        var dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler((s, x) =>
        {
            dispatcherTimer.Stop();
            test.Background = new SolidColorBrush(Colors.White);


        });

        dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 200);

        dispatcherTimer.Start();