Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-VS2010:如何在不阻塞UI的情况下做一些事情并等待一段时间?_C#_Visual Studio 2010 - Fatal编程技术网

C#-VS2010:如何在不阻塞UI的情况下做一些事情并等待一段时间?

C#-VS2010:如何在不阻塞UI的情况下做一些事情并等待一段时间?,c#,visual-studio-2010,C#,Visual Studio 2010,我正在制作一个简单的应用程序,我需要做一些事情,并更新一个进度条。我做一些事情,等待1秒,如果执行正常,我增加一个进度条,做一些其他事情,再等一秒钟,如果正常,增加进度条,以此类推,7次。这意味着我通过RS232连接到一个电子板,发送一些命令,然后执行,1秒钟后我检查板上的一切是否正常。我需要等一秒钟,等黑板上有类似的东西 问题在于等待那一秒钟。如果我使用Thread.Sleep(1000),整个UI会冻结(正如预期的那样),进度条也会因为同样的原因在“未同步”等待中工作 我的代码如下: pro

我正在制作一个简单的应用程序,我需要做一些事情,并更新一个进度条。我做一些事情,等待1秒,如果执行正常,我增加一个进度条,做一些其他事情,再等一秒钟,如果正常,增加进度条,以此类推,7次。这意味着我通过RS232连接到一个电子板,发送一些命令,然后执行,1秒钟后我检查板上的一切是否正常。我需要等一秒钟,等黑板上有类似的东西

问题在于等待那一秒钟。如果我使用Thread.Sleep(1000),整个UI会冻结(正如预期的那样),进度条也会因为同样的原因在“未同步”等待中工作

我的代码如下:

progressBar1.Value = 0;

/* Do some stuff */
Thread.Sleep(1000);
/* Check the stuff */

progressBar1.Value = 1;

/* Do some stuff */
Thread.Sleep(1000);
/* Check the stuff */

progressBar1.Value = 2;

/* Do some stuff */
Thread.Sleep(1000);
/* Check the stuff */
等等。。。7次

每一步的“材料”都是不同的

让我的代码等待1秒的最佳方法是什么


谢谢你的帮助

如果您的.NET Framework版本支持任务并行库(TPL),则应该使用它。这正是第三方物流旨在解决的问题。为此,您将启动一个异步任务,它是Thread类顶部的封装

从概念上讲,您应该为RS232板的连接创建一个新的线程。主线程(UI线程)保持执行,不会冻结UI。如果这是一个Windows应用程序,您应该阅读更多关于多线程编程的内容,因为在Windows应用程序中使用需要“同时”执行许多操作的单个线程将始终导致阻塞和冻结问题

如果.NET Framework版本不支持TPL,则应使用名为BackgroundWorker的类。下面是一个小示例,让您开始学习:


PS:我的回答是基于您正在编写Windows窗体应用程序的假设。

下面是一个非常简单、精心设计的WinForms示例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;

namespace ProgressBar
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void btnDoWork_Click(object sender, EventArgs e)
        {
            Task task1 = new Task(() => { System.Threading.Thread.Sleep(5000); });
            Task task2 = new Task(() => { System.Threading.Thread.Sleep(5000); });
            Task task3 = new Task(() => { System.Threading.Thread.Sleep(5000); });
            Task task4 = new Task(() => { System.Threading.Thread.Sleep(5000); });

            task1.ContinueWith((t) =>
            {
                if (t.Exception != null)
                    t.Exception.Handle(ex =>
                    {
                        //do something
                        return true;
                    });
                progressBar.Value = 25;
            }, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((t) => task2.Start());


            task2.ContinueWith((t) =>
            {
                if (t.Exception != null)
                    t.Exception.Handle(ex =>
                    {
                        //do something
                        return true;
                    });
                progressBar.Value = 50;
            }, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((t) => task3.Start());

            task3.ContinueWith((t) =>
            {
                if (t.Exception != null)
                    t.Exception.Handle(ex =>
                    {
                        //do something
                        return true;
                    });
                progressBar.Value = 75;
            }, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((t) => task4.Start());

            task4.ContinueWith((t) =>
            {
                if (t.Exception != null)
                    t.Exception.Handle(ex =>
                    {
                        //do something
                        return true;
                    });
                progressBar.Value = 100;
            }, TaskScheduler.FromCurrentSynchronizationContext());

            task1.Start();
        }
    }
}

基本上,只需为每个操作创建一个任务;然后在继续该任务时,检查(这一点非常重要,因为如果您没有检查它,并且出现异常,那么当任务被垃圾收集时,您的程序将崩溃)。在完成这一延续之后,只需启动下一个任务。如果需要从其中一个任务执行UI访问,请确保从CurrentSynchronizationContext调用该任务。

1。查看线程/后台进程2。为什么要让代码等待1秒?什么类型的应用程序?Winforms?安慰Web?我不知道线程是什么。睡眠是用来做什么的,但很可能你想使用计时器+事件处理程序。相关:
等待任务。延迟(1000)