Thread.sleep代码();睡觉所有程序

时间:2016-03-31 10:21:23

标签: c# multithreading thread-sleep ui-thread

我的进度条有问题,我想像以下代码一样运行两个进度条:

namespace probando
{
    public partial class MainWindow : Window
    {

            int sec = 0;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            string stringSec = sec.ToString();

            for (int i = 0; i <= sec; i++)
            {
                masuno(i,sec);
            }

        }

        private void Tiempo_segundos_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            sec = (int) Tiempo_segundos.Value;
        }

        private void masuno(int i, int sec)
        {
           Porcentaje_restante.Maximum = sec;

           Porcentaje_restante.Dispatcher.Invoke(() => Porcentaje_restante.Value = i, DispatcherPriority.Background);

           Thread.Sleep(1000);
        }
    }
}

我有另一个进度条,当第一个条形图正在工作时,不确定的购买不起作用。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

Thread.Sleep暂停当前线程。

从您的代码中我假设您在Windows窗体或wpf应用程序中使用它,对吧?

现在只有一个ui线程。现在,当你在ui线程中睡觉时,整个ui暂停了。所以你必须在后台线程中放入不是ui的工作代码。

请看这个问题: How to update the GUI from another thread in C#?How to update UI from another thread running in another class

以及关于线程模型的MSDN Article

答案 1 :(得分:0)

如果Sleep用于延迟UI线程中的某些内容(模拟工作,拆分某些内容,等等),那么您可以使用async/await来正确执行此操作(Sleep正在阻止UI线程):

async void masuno(int i, int sec)
{
    ...

    // Thread.Sleep(1000); - instead of this do:
    await Task.Delay(1000);
}

答案 2 :(得分:0)

查看专为此类场景设计的BackgroundWorker。它在后台线程上运行您的长进程,并允许您在进度更改时执行UI更新。