Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/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
C# 多线程:新窗体关闭过快_C#_Multithreading_Forms_Progress Bar_Marquee - Fatal编程技术网

C# 多线程:新窗体关闭过快

C# 多线程:新窗体关闭过快,c#,multithreading,forms,progress-bar,marquee,C#,Multithreading,Forms,Progress Bar,Marquee,我想显示一个带有进度条字幕的新表单。这个表单应该在另一个线程上,因为调用的操作太大,如果它在同一个线程上,UI不会更新进度条 我调用一个新线程,创建我的表单,但一旦它出现,表单就会关闭 以下是我的主要代码: frmProgress f = new frmProgress(); Thread t = new Thread(new ThreadStart(delegate() { f.Show(); })); t.Start(); documentManager.Co

我想显示一个带有进度条字幕的新表单。这个表单应该在另一个线程上,因为调用的操作太大,如果它在同一个线程上,UI不会更新进度条

我调用一个新线程,创建我的表单,但一旦它出现,表单就会关闭

以下是我的主要代码:

    frmProgress f = new frmProgress();
    Thread t = new Thread(new ThreadStart(delegate() { f.Show(); }));
    t.Start();
    documentManager.Compile(); //This is my big action
    t.Abort();
以下是表格代码:

    public frmProgress()
    {
        InitializeComponent();
    }
我想知道我做错了什么


谢谢

您有几个问题:

  • 您正在非UI线程中显示表单。这只会造成问题,;它需要在UI线程中
  • 您正在UI线程中执行长时间运行的任务;这将阻止UI更新
  • 您需要在UI线程中显示论坛,并在后台线程中运行长时间运行的任务

    这项工作的一个很好的工具是使用
    BackgroundWorker
    。它将为您完成许多工作,以确保在UI/非UI线程中运行正确的代码。创建一个新的
    BackgroundWorker
    ,并将长时间运行的任务放入
    DoWork
    事件中。在启动BGW之前,进行所需的任何简单UI更新(显示表单),并在
    Completed
    事件(将在UI中运行)中执行任何清理。有一些


    使用
    BackgroundWorker
    的另一个优点是,您可以轻松地报告进度(如果您有一个了解完成百分比的好方法),而不仅仅是有一个选框栏。只需在
    ProgressReported
    事件处理程序中添加一个处理程序来更新进度条,并在执行工作时定期调用
    ReportProgress
    方法。请参阅链接的示例以了解确切的代码片段。

    您有几个问题:

  • 您正在非UI线程中显示表单。这只会造成问题,;它需要在UI线程中
  • 您正在UI线程中执行长时间运行的任务;这将阻止UI更新
  • 您需要在UI线程中显示论坛,并在后台线程中运行长时间运行的任务

    这项工作的一个很好的工具是使用
    BackgroundWorker
    。它将为您完成许多工作,以确保在UI/非UI线程中运行正确的代码。创建一个新的
    BackgroundWorker
    ,并将长时间运行的任务放入
    DoWork
    事件中。在启动BGW之前,进行所需的任何简单UI更新(显示表单),并在
    Completed
    事件(将在UI中运行)中执行任何清理。有一些


    使用
    BackgroundWorker
    的另一个优点是,您可以轻松地报告进度(如果您有一个了解完成百分比的好方法),而不仅仅是有一个选框栏。只需在
    ProgressReported
    事件处理程序中添加一个处理程序来更新进度条,并在执行工作时定期调用
    ReportProgress
    方法。查看链接的示例以获取精确的代码片段。

    您是否查看了
    BackgroundWorker
    类及其
    ReportProgress
    方法?是的,但我认为使用“new Thread()”并在完成后中止会更简单…@LolCat No,实际上要简单得多。@LolCat创建一个简单的测试应用程序,并使用Servy答案中引用的示例,可能会很麻烦。一旦我熟悉了BackgroundWorker,我的生活就轻松了很多次。那我就试试BackgroundWorker。感谢你们两位。你们看过
    BackgroundWorker
    类和它的
    ReportProgress
    方法吗?是的,但我认为使用“new Thread()”和在我完成后中止会更简单…@LolCat No,实际上要简单得多。@LolCat创建一个简单的测试应用程序,并使用Servy答案中引用的示例,可能会很麻烦。一旦我熟悉了BackgroundWorker,我的生活就轻松了很多次。那我就试试BackgroundWorker。谢谢你们两位。