Tag: multithreading

如何closures第二个UI线程

我需要能够在第二个UI线程上启动一个窗口并随意closures它。 这是我现在的代码: /// <summary>Show or hide the simulation status window on its own thread.</summary> private void toggleSimulationStatusWindow(bool show) { if (show) { if (statusMonitorThread != null) return; statusMonitorThread = new System.Threading.Thread(delegate() { Application.Run(new AnalysisStatusWindow(ExcelApi.analyisStatusMonitor)); }); statusMonitorThread.Start(); } else { if (statusMonitorThread != null) statusMonitorThread.Abort(); statusMonitorThread = null; } } AnalysisStatusWindow是一个相当基本的System.Windows.Forms.Form 上面的代码正在成功创build新的UI线程,但是我的Abort线程的请求被忽略。 结果是多次切换上述函数只是导致新的窗口打开 – 所有这些都在他们自己的线程和function齐全。 有什么办法可以传递消息到这个线程closures很好吗? […]

在Excel中multithreading计算速度很慢

我想知道是否有任何方法来控制Excel的计算,使WB中的几张纸重新计算并行,而其他的不是。 我的问题是,在目前设置的顺序计算过程,我已经花了太长时间。 这个序列是从VBA驱动的,如下所示:1)VBA调用一个插件(excel-dna vb.net插件,控制数据读取器和附加数据库)2)插件将数据返回到表1.表2-3重新计算按顺序(第2页,然后是第3页)3)第4页到第10页按顺序重新计算,但是由于每个页面独立地只与页面2相连,所以它们理论上可以重新计算 – 但如何做到这一点? 4)再次通过1)中描述的通过vba addin调用新数据开始处理) 在笔记本电脑上运行一个数据子集(64位,32位excel,英特尔i7)需要54.6秒。 有趣的是,如果我closuresmultithreading,它需要25.8秒! 更重要的是,如果我在一台超级快速的机器上运行它(2 x Intel Xeon X5570,四核“Nehalem”架构,64位64位excel),它比我的笔记本电脑要慢,multithreading需要230秒,或者没有26秒。 我想知道是否有更好的方法可以利用多核心和multithreading。 缓慢的位似乎是优秀的重新计算,而不是外加速度。 任何build议感激。 编辑:上面的描述有点简化 – 实际上,我还有一个迭代的“calc / paste-vales / recalc”过程,在每张表4-10上运行(迭代继续进行,直到达到某个所需的灵敏度,只有这样计算完整的表格)。 我相信这使得在当前devise下运行一个wb计算是行不通的。 表4-10是相同的(硬编码input参数除外),彼此之间没有计算依赖关系。 如果每个计算过程(提到的迭代过程和表格计算)可以并行而不是按顺序完成,我认为整个过程会更快。 仅供参考,我已经进行了更为明显的精简和testing(分解公式,分离易失性函数等)。 在整个过程中运行整个数据集大约需要16个小时,这就是为什么我急于find一些方法来改进这一点。 谢谢!

如何在C#中正确closures/处理Excel COM?(Excel进程不closures)

是的,我知道,这是在互联网上,也可能在这里,我也跟着很多例子,但仍然没有closures,我真的厌倦了这个问题,如果有人可以find一个解决scheme,而不是杀死Excel过程中,请通过分享来帮助我! 我的代码: #region ////////// Declarations and initialisations ////////// string[] sFilesPath = System.IO.Directory.GetFiles(Path); // Get all files from current Path MSExcel.Application xlApp = null; MSExcel.Workbook xlWorkBook = null; MSExcel.Workbooks xlWorkBooks = null; MSExcel.Sheets xlSheets = null; MSExcel.Shapes xlShapes = null; MSExcel.Worksheet xlWorkSheet = null; MSExcel.Worksheets xlWorkSheets = null; xlApp = new MSExcel.Application(); xlApp.Visible = false; xlApp.DisplayAlerts […]

如何在线程安全庄园中迭代Excel文档

我完全不在这里,我承认我有点困惑,应该如何工作。 我有一个Excel文件,我试图parsing一个线程安全的方式。 这是我到目前为止: public IEnumerable<DepartmentOfEnergyIndex> ParseJet(Workbook workbook) { var indecies = new ConcurrentQueue<DepartmentOfEnergyIndex>(); var worksheet = (Worksheet)workbook.Worksheets.Item["Data 6"]; Parallel.ForEach(worksheet.Rows, currentRow => { indecies.Enqueue( new DepartmentOfEnergyIndex { DOELastUpdated = currentRow[0], DollarsPerGallon = currentRow[1], RegionID = RegionEnum.USGC.ToInt(), }); }); return indecies.ToArray(); } 我遇到的第一个问题(除了缺乏知识)是ForEach抛出一个编译器错误: Error 1 The type arguments for method 'System.Threading.Tasks.Parallel.ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Action<TSource>)' cannot be inferred from the […]

Excel Interop的RefreshAll()方法是如何工作的?

有一堆excel文件。 每个excel文件都有连接到SQL Server Analysis(SSAS)多维数据集的各种数据透视表。 平均而言,手动完成时,每个文件需要大约30到60分钟才能刷新。 我正在自动化写这个C#程序。 遍历每个文件,这些是步骤: 实例化excel应用程序 打开工作簿 调用.RefreshAll()方法 closures工作簿 退出excel应用程序。 目前,我已经做了顺序执行。 没有multithreading。 我打开进程资源pipe理器,我发现在进行文件刷新时,对于excel进程,CPU占用1%到2%左右。 我的问题是将在多个线程上运行这些步骤带来的程序的总时间? 是.RefreshAll()方法IO密集? 如果是这样,IO会成为我所有multithreading的瓶颈吗?

部分WinForm UI冻结时,通过Windows任务栏的Excel VSTO切换窗口或应用程序

我有一个奇怪的问题(可能是线程问题),一直困扰着我。 我想为我在Excel / VSTO中运行的任务创build一个进度条,通过单击function区上的button启动它。 由于所有对Excel对象模型的访问都必须在主线程中进行,所以我在单独的线程上以模态方式显示我的进度表单。 这在大多数情况下都很有效,但是当我通过Windows任务栏切换应用程序或窗口时会发生奇怪的事情。 例如,如果我处于运行中并且Excel最大化,并且在任务栏上单击了Chrome以使其聚焦,那么我将单击回到Excel,然后在任务栏预览中单击打开的Excel工作簿,有时UI会在进度条中部分冻结。 在Excel 2007/2010中,我仍然可以看到正在更新的进度栏,但是我不能拖动工具栏或单击“取消”button。 这就是为什么我说UI部分冻结。 类似的东西发生在Excel 2013/2016,但我还没有testing过。 如果Excel具有焦点,并且在任务执行期间不切换到另一个窗口,则进度条可以很好地工作。 有没有人有一个想法可能会出错? 有没有另外一种方法可以在Excel中显示进度条来提供一致和可靠的行为? 请注意,实际任务需要在Excel主要UI线程上运行,并且进度表单是交互式并正确显示的限制,它需要位于辅助UI线程上。 正因为如此,像使用BackgroundWorker的解决scheme将无法正常工作。 class RunSampleProgressTask { private ProgressForm _form; internal volatile bool CancelPending; internal volatile AutoResetEvent SignalEvent = new AutoResetEvent(false); internal RunSampleProgressTask() { //create a new workbook Globals.ThisAddIn.Application.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); int hwnd = GetHwnd(); var thread = new Thread(() => ShowProgressForm(hwnd)); thread.SetApartmentState(ApartmentState.STA); thread.Priority […]

线程传递数据和窗口closures

我创build了一个简单的WPF项目,在button单击我创build一个单独的线程与新窗口,并将数据传递给它。 在应用程序退出时,我试图closures该线程/窗口。 但是,偶尔会遇到以下exception,这会导致应用程序不稳定。 所以我的问题是如何妥善处理这种情况。 谢谢 在线: Dispatcher.Invoke(new Action(() => 我有 A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll Additional information: Thread was being aborted. 我的视图有以下代码: 构造函数 public MyView(ConcurrentQueue<MyItem> actionReports, ManualResetEvent actionCompletedEvent, string actionName) { _actionReports = actionReports; _actionCompletedEvent = actionCompletedEvent; _actionName = actionName; InitializeComponent(); DataContext = this; this.Loaded += MyView_Loaded; } void MyView_Loaded(object […]

Excel文件上的C#multithreading访问

我正在编写一个multithreading的C#应用​​程序,它提供了一些Excel文件的统计信息。 我通过以下代码打开文件: private static Excel.Application excelApp = new Excel.Application(); private static Excel.Workbook workbook = excelApp.Workbooks.Open(path); private static Excel.Worksheet worksheet = workbook.ActiveSheet; private static Excel.Range range = worksheet.UsedRange; private static int totalColumns = worksheet.UsedRange.Columns.Count; 为了从列中收集数据,我使用了每列一个线程。 for (int columnCount = 1; columnCount <= /*range.Columns.Count*/totalColumns; columnCount++) { Thread worker = new Thread(printSpread); worker.Start(columnCount); } 我得到HRESULT:0x800A01A8如果我不在每个线程中启动一个新的Excel应用程序错误。 我的问题是,我必须这样做还是有机会只使用一个Excel应用程序? 我认为,从多个线程访问仅来自一个应用程序的数据存在问题,这将解释COMexception。 感谢您的时间和帮助。

使用多个线程处理大型Excel文件

我正在使用C#VSTO和Interop lib来开发Excel加载项。 用于在将这些值粘贴到具有格式的其他工作簿之前validation每个单元格的值。 我的实际查询是处理,(以尽可能最快的方式)与一些标准单元格。 我已经使用WorkSheet.Cells.SpecialCells()获取我感兴趣的Excel.Range对象,并使用线程来同时处理Excel.Range(由SpecialCells()返回)。 以下是一些观察/问题: 看来Excel.Range不能根据偏移和长度分割(即我不能从现有的范围基于一些偏移量和计数得到新的范围对象) 如果我们在线程中共享范围对象并试图以不同批次处理单元格,我们得到以下exception:“消息filter指示应用程序正忙(从HRESULTexception:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))”这也留下批次细胞未处理。 任何解决上述问题的input或指针都会有所帮助。 另外,任何有关处理大型Excel文件的build议都可以在几秒内完成(这是目前最大的瓶颈)

用多个线程写入excel文件

我正在尝试写入数据表到excel有大record.I试图实现使用分而治之,每个线程被分配写入各自excelworkbook.but但我越来越文件是只读,单击确定以覆盖文件。 class Program { int processorCount = 2; static volatile bool processing = true; DataTable employeeTable = new DataTable("Employee"); ManualResetEvent mre = new ManualResetEvent(false); AutoResetEvent ar = new AutoResetEvent(true); int record_count; static void Main(string[] args) { Program p = new Program(); //Create an Emplyee DataTable p.employeeTable.Columns.Add("Employee ID"); p.employeeTable.Columns.Add("Employee Name"); for (int i = 0; i […]