C# 如何在新线程上逐个运行多个方法
我用C#构建了我的第一个Windows窗体,我开始遇到一些没有响应的问题。只有当我开始点击其他地方或开始做其他事情时,才会发生这种情况。我已经研究了一些,并了解到线程可能会有所帮助,但不能确切地指出我应该如何做到这一点。下面是我现在正在尝试的C# 如何在新线程上逐个运行多个方法,c#,.net,winforms,C#,.net,Winforms,我用C#构建了我的第一个Windows窗体,我开始遇到一些没有响应的问题。只有当我开始点击其他地方或开始做其他事情时,才会发生这种情况。我已经研究了一些,并了解到线程可能会有所帮助,但不能确切地指出我应该如何做到这一点。下面是我现在正在尝试的 private void bPrint_Click(object sender, EventArgs e) { bPrint.Enabled = false; string cusNo = Strings.Left
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é想要添加另一个注释,其中包含指向推荐线程源的链接。我的方法上的返回类型需要是什么?现在它们都是“公共静态无效”。等待?异步的?