C# 如何在新线程上逐个运行多个方法

C# 如何在新线程上逐个运行多个方法,c#,.net,winforms,C#,.net,Winforms,我用C#构建了我的第一个Windows窗体,我开始遇到一些没有响应的问题。只有当我开始点击其他地方或开始做其他事情时,才会发生这种情况。我已经研究了一些,并了解到线程可能会有所帮助,但不能确切地指出我应该如何做到这一点。下面是我现在正在尝试的 private void bPrint_Click(object sender, EventArgs e) { bPrint.Enabled = false; string cusNo = Strings.Left

我用C#构建了我的第一个Windows窗体,我开始遇到一些没有响应的问题。只有当我开始点击其他地方或开始做其他事情时,才会发生这种情况。我已经研究了一些,并了解到线程可能会有所帮助,但不能确切地指出我应该如何做到这一点。下面是我现在正在尝试的

 private void bPrint_Click(object sender, EventArgs e)
        {
bPrint.Enabled = false;
            string cusNo = Strings.Left(cbCustomerList.SelectedItem.ToString(), 4);
            ReportDocument reportDocument = new ReportDocument();


                        switch (cusNo)
            {

                case "4018":

                    try
                    {
                        Thread backgroundThread2 = new Thread(
                        new ThreadStart(() =>

                            FixPhoneNumbers(orderData, cusNo, dtpBeginDate.Value, dtpEndDate.Value,
                            Settings.Default["Location"].ToString(), lProgress)));


                        backgroundThread2.Start();
                        Thread backgroundThread3 = new Thread(
                        new ThreadStart(() =>

                            CreateBol(orderData, cusNo, dtpBeginDate.Value, dtpEndDate.Value,
                             Settings.Default["Location"].ToString(), lProgress)));

                        backgroundThread3.Start();
                        Thread backgroundThread4 = new Thread(
                        new ThreadStart(() =>

                            CreateUccPerLine(orderData, cusNo, dtpEndDate.Value, dtpEndDate.Value,
                            Settings.Default["Location"].ToString(), lProgress)));


                        backgroundThread4.Start();

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Loading " + ex.Message, MessageBoxButtons.OK,
                            MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1,
                            MessageBoxOptions.ServiceNotification);

                    }
                    finally
                    {

                        Thread backgroundThread1 = new Thread(
                        new ThreadStart(() =>

                            AssignProNumber(orderData, cusNo, dtpBeginDate.Value, dtpEndDate.Value,
                               Settings.Default["Location"].ToString(), lProgress)));


                        backgroundThread1.Start();

                        LoadDS(orderData, cusNo, dtpBeginDate.Value, dtpEndDate.Value,
                            Settings.Default["Location"].ToString(), lProgress);


                        PrintReport(orderData, reportDocument, "psWalmart.rpt",
                            Settings.Default["RegularPrinter"].ToString(), Settings.Default["LabelPrinter"].ToString());


                        PrintReport(orderData, reportDocument, "lbWalmart.rpt",
                            Settings.Default["RegularPrinter"].ToString(), Settings.Default["LabelPrinter"].ToString());

                        PrintReport(orderData, reportDocument, "boWalmart.rpt",
                            Settings.Default["RegularPrinter"].ToString(), Settings.Default["LabelPrinter"].ToString());

                        PrintReport(orderData, reportDocument, "qtyOrderedReport.rpt",
                            Settings.Default["RegularPrinter"].ToString(), Settings.Default["LabelPrinter"].ToString());

                        PrintReport(orderData, reportDocument, "qtyOrderedGreaterOne.rpt",
                            Settings.Default["RegularPrinter"].ToString(), Settings.Default["LabelPrinter"].ToString());
                    }



                    break;
}

这样做的新方法是使用

示例

private void bPrint_Click(object sender, EventArgs e)
{
    await Task.Run(() =>
    {
        FixPhoneNumbers(orderData, cusNo, dtpBeginDate.Value, dtpEndDate.Value,
                        Settings.Default["Location"].ToString(), lProgress)))
    });
}
您还可以运行多个任务

private void bPrint_Click(object sender, EventArgs e)
{
    var task1 = DoWorkAsync();
    var task2 = DoMoreWorkAsync();

    await Task.WhenAll(task1, task2);
}
瑞安

我在ASP.NET站点中使用线程基本上处理批处理。此线程进程将在另一个线程中运行ProcessMyData()方法

//Create new object and start processing
MySite.Data.ProcessData Batch = new Data.ProcessData();
Batch.StartBatchProcessing();

//The StartBatchProcessing() Creates the new thread
public void StartBatchProcessing()
{    
    //ProcessMyData is the main method that will process the batch data
    Thread newThread = new Thread(this.ProcessMyData); //another thread
    newThread.Priority = ThreadPriority.Normal;
    newThread.Start();
}

有关其他详细信息,请参考

在线程内执行的代码按顺序执行,因此要逐个运行多个方法,只需在线程代码内的单独行中编写它们,就像编写任何C#代码一样

我强烈推荐使用c#而不是线程,它们更容易一点


也可能Async/Await值得一试,但我不确定winforms对它的支持程度。

你看过Async/Await了吗?我强烈建议不要开始学习winforms的线程编程经验。如果您仍然这样做,请阅读一些有关该主题的教程。线程是你能做的最复杂的事情之一。不管怎样,你的目标到底是什么?我还没有研究过async/await。我只是对每个方法都这样做吗?是否要等到第一个线程完成后再开始下一个线程?如果他想理解线程,他应该在继续执行任务之前以“老派”的方式学习线程。如果他只是想把事情做完,任务才是最重要的@Ryan根据您的代码的结构,您似乎希望为每个方法都使用它。我会创建多个任务,然后使用WhenAll,正如我在回答中所指出的那样。WhenAll返回一个任务,该任务表示等待一切完成且不阻塞的操作。@RomanoZumbé想要添加另一个注释,其中包含指向推荐线程源的链接。我的方法上的返回类型需要是什么?现在它们都是“公共静态无效”。等待?异步的?