Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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_Backgroundworker - Fatal编程技术网

C# 应用程序。等待或线程。睡眠

C# 应用程序。等待或线程。睡眠,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我已经在使用backgroundworker.RunAsyn()在单独的线程上运行代码。但是,我遇到了代码在前一行完成之前迭代到下一行的部分。我是否应该创建一个单独的backgroundworker来处理这个问题?或者我应该使用Application.Wait()还是Thread.Sleep()我不确定延迟的时间,我不希望我的程序只是坐在那里等待额外的不需要的时间,所以我不确定该走哪条路线。这里是一个麻烦制造者的片段 public Form_Main() { InitializeCompo

我已经在使用
backgroundworker.RunAsyn()
在单独的线程上运行代码。但是,我遇到了代码在前一行完成之前迭代到下一行的部分。我是否应该创建一个单独的
backgroundworker
来处理这个问题?或者我应该使用
Application.Wait()
还是
Thread.Sleep()
我不确定延迟的时间,我不希望我的程序只是坐在那里等待额外的不需要的时间,所以我不确定该走哪条路线。这里是一个麻烦制造者的片段

public Form_Main()
{
   InitializeComponent();
   backgroundworker1.WorkerReportsProgress = true;
   backgroundworker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
   backgroundWorker1_ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}

private void btnOpenRefreshSave_Click()
{
   backgroundWorker1_RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   Excel.Application exApp;
   Excel._Workbook exBook;
   Excel._Worksheet exSheet;

   exBook = (Excel._Workbook)(exApp.WOrkbooks.Open("C:\\Book1.xlsx")); 
   exSheet = (Excel._Worksheet)(exBook.ActiveSheet);
   //This is the line of code that often times takes a while
   exBook.RefreshAll();
   //end of trouble line
   exBook.SaveAs("C:\\Updated_Book1.xlsx");
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{

}

为什么要延迟某个事件,您不能将工作簿保存在诸如SheetCalculate(在重新计算任何工作表或在图表上绘制任何更改的数据后发生)之类的事件上,并在代码中设置一些标志,然后在该事件(或任何更相关的事件)上重置该标志。

为什么要延迟某个事件,您不能将工作簿保存在SheetCalculate(在重新计算任何工作表或在图表上绘制任何更改的数据后发生)等事件上,并在代码中设置一些标志,然后在该事件(或任何更相关的事件)上重设该标志。

问题是由于RefreshAll在后台线程上运行而导致的。所以,基本上你有自己的后台工作人员在运行,还有一个你没有预料到的后台工作人员

refreshAll的文档说明: BackgroundQuery属性设置为true的对象将在后台刷新

因此,只有将该属性设置为false才能解决此问题。然后refreshall将在backgroundworker的上下文中运行,这就是您的意图


如果这仍然不起作用,那么您必须重新考虑您的逻辑,并查找刷新完成时触发的某种事件。如果这不存在,那么除了睡眠之外就没有其他解决方案,但这根本不是一个好的解决方案,因为您不知道要睡眠多长时间。

问题的原因是RefreshAll在后台线程上运行。所以,基本上你有自己的后台工作人员在运行,还有一个你没有预料到的后台工作人员

refreshAll的文档说明: BackgroundQuery属性设置为true的对象将在后台刷新

因此,只有将该属性设置为false才能解决此问题。然后refreshall将在backgroundworker的上下文中运行,这就是您的意图


如果这仍然不起作用,那么您必须重新考虑您的逻辑,并查找刷新完成时触发的某种事件。如果这不存在,那么除了睡觉就没有别的解决办法,但这根本不是一个好的解决办法,因为你不知道要睡多久。

在这里,你会想到一些事情。您可以尝试使用类似于下面的方法

if (Application.CalculationState === xlDone Then
    everything is finished calculating[enter link description here][1]
另一个选项是(正如其他人所建议的)更改背景刷新属性。快速扫描工作簿可以通过编程方式为您改变这一点

foreach (Wrksheet ws in workbook.wss)
{
    foreach (QueryTable table in ws.QueryTables)
      table.BackgroundQuery = false;
}
workbook.RefreshAll();

关于在这里做什么,我想到了几件事。您可以尝试使用类似于下面的方法

if (Application.CalculationState === xlDone Then
    everything is finished calculating[enter link description here][1]
另一个选项是(正如其他人所建议的)更改背景刷新属性。快速扫描工作簿可以通过编程方式为您改变这一点

foreach (Wrksheet ws in workbook.wss)
{
    foreach (QueryTable table in ws.QueryTables)
      table.BackgroundQuery = false;
}
workbook.RefreshAll();

“代码在前一行完成之前迭代到下一行”是什么意思?@SriramSakthivel它将在刷新操作完成之前保存工作簿。reference和RefreshAll是同步的,因此您无需执行任何其他操作…@AdrianoRepetti Documentation。我对文档的看法正确吗?你所说的“代码在前一行完成之前迭代到下一行”是什么意思?@SriramSakthivel它将在刷新操作完成之前保存工作簿。reference和RefreshAll是同步的,因此您无需执行任何其他操作…@AdrianoRepetti Documentation。我对文档的看法正确吗?我以前从未使用过SheetCalculate,你能提供一个如何执行此操作的示例吗?我以前从未使用过SheetCalculate,你能提供一个如何执行此操作的示例吗?我无法将所有内容更改为enablebackgroundrefresh=false。因此,我认为我将不得不使用Thread.Sleep(),尽管我很鄙视它。对我来说,能够改变一切以启用backgroundrefresh=false是不现实的。所以我想我将不得不使用Thread.Sleep(),尽管我很鄙视它。