Tag: multithreading

C#BackgroundWorker线程通过服务器发送消息写入Excel 2007

我希望对以下devise有一些看法: 我有一个服务器,不断发送消息,我写了一个C#程序集订阅。 目前,每当有消息发送时,我会将其asynchronous写入ms Excel 2007.由于这是一个资源繁重的过程,我使用了后台工作线程来处理与服务器的连接,并在写入excel之前接收消息。 public static void bw_DoWork(object sender, DoWorkEventArgs e) { //This method will establish conn to server, and subscribe to the messages sent asynchrously. //After which, createSpreadsheet(String msg) will be called to write the message to excel runMsgServerConsumer(); } 问:这是一个很好的devise吗? 或者,我已经让主线程build立conn到服务器,并让backgroundworker线程通过createSpreadsheet(String msg)处理写入excel。

自动化错误80004005

这几天我一直在殴打自己,在互联网上search。 我知道有很多我不太了解Com Interop,但是我已经成功地使用Excel来构build和使用更简单的DLL。 反正到了这一点。 我得到上面提到的错误-2147467259 80004005 Automation Error Unspecified Error Excel VBA中运行以下代码包装在一个DLL中。 [GuidAttribute("96BE21CD-887B-4770-9FAA-CF395375AEA9")] [ComVisibleAttribute(true)] interface QInterface { void ConnectionFill(string SQLQuery, string CONStr); string QueryValue(int QueryKey); string ConnectionValue(int ConnectionKey); string outputFile { get; set; } void ThreadTest(); } [ClassInterfaceAttribute(ClassInterfaceType.None)] [ProgIdAttribute("QueryThread")] class QueryThread : QInterface { DataSet QueryReturn = new DataSet(); private ArrayList SQLList = new ArrayList(); […]

如何使一个用户表单发布系统graphics(.net)

我使用的是VS2008,我已经设法将我自学(严重)的代码和我在互联网上find的东西放在一起,现在我已经遇到了困难。 我看了一下,我不知道如何解决这个问题。 当有人按下一个button时,我会向两个模块发送数据,第一个将数据网格放置在数据网格的顶部并旋转图像,同时等待第二个线程将数据保存到Excel。 我得到的问题是当它运行代码时,到达'Me.PictureBox4.Image = DirectCast(BM_out.Clone(),System.Drawing.Image)'这一行'错误信息'在别处使用的对象'。 Public MoveByCalc As Double Public ReturnStack As New System.Collections.Generic.Stack(Of Integer) Public BM_In As New Bitmap(My.Resources.Fan) Public Wid As Single = BM_In.Width Public Hgt As Single = BM_In.Height Public Cx As Single = Wid / 2 Public Cy As Single = Hgt / 2 Public TimeElapsed As Single = 1 […]

如何在指定的terminal会话帐户上打开Excel / Powerpoint,而不是使用最低ID的默认值?

大家好, 我有一个应用程序(Windows服务/ C#)启动EXCEL和POWERPOINT,并使用系统剪贴板复制这两个应用程序之间的数据。 应用程序在多个活动terminal会话的服务器上运行。 默认情况下,Office应用程序在会话ID最低的会话中启动。 COM对象 我使用COM对象在ms-service和office应用程序之间进行通信。 下面的代码是我如何运行EXCEL的一个例子。 xlApp = new Microsoft.Office.Interop.Excel.Application(); xlWorkBook = xlApp.Workbooks.Open("path_to_my_file", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); multithreading – 并行会话 ATM应用程序正在单线程模式下运行。 我打算同时运行两个…问题是我只有1个剪贴板可用于通信目的。 为了获得另一个,我打算在2个独立的窗口会话上运行整个应用程序。 在这种情况下,我会有2个独立的单线程解决scheme。 将有2个服务的副本,运行自己的办公应用程序,我会有2个单独的剪贴板供我使用。 问题 有一件事尚未解决 – 我不知道如何强制这些办公应用程序运行在不同的用户会话。 从我所看到的情况来看,他们总是在一个身份证号码最低的sesison中跑步。 我发现了类似的问题 – 在terminal服务器上,服务如何在用户会话中启动一个进程? ,但是,运行一个进程并不像通过COM对象运行Office应用程序那样。 编辑:我注意到,如果我打开EXCEL不是从WINDOWS服务,而是从WINDOWS FROMS应用程序,EXCEL行为不同。 它不再在用户会话中以最低ID开始,而是在WINDOWS FORMS APP正在运行的相同帐户上打开。 这不知何故解决了我的问题,我将能够运行2个并行进程:)

通过线程从Excel中提取数据

我试图从多个线程使用OleDBAdapter从Excel中提取数据与Fill()方法一起执行此操作。 每个线程都会接收一个新的OleDBAdapter以及startIndex和rowsCount来提取。 我的问题是每个线程开始时,他们都卡在Fill()方法。 我已经尝试了不同的连接string和适配器,看看是否会帮助,但没有运气到目前为止。 这似乎是第一个连接的Excel工作表locking它,直到它结束,因此我失去了线程的效率。 我到目前为止还没有尝试过的唯一方法是复制文件的不同名称,即添加threadIndex到最后,然后我可以有多个连接,因为数据源是不同的,但这似乎是我可以做的最糟糕的事情。

从另一个线程访问Excel对象模型

我正在写一个VB.NET库,这将有助于生成Excel报告。 我是.NET / VS2010新手,很抱歉,如果我想做错的事情。 我需要的一个function是启动一个线程来执行一些工作(从Access数据源刷新工作簿)的例程,而主线程检查是否有任何对话框因为刷新失败而在Excel窗口中popup。 我遇到的问题是新线程无法引用Excel.Application对象。 它不会产生错误,只会冻结。 这里是我的情况的演示: Imports System.Threading Imports System.Diagnostics Imports System.Runtime.InteropServices Imports Microsoft.Office.Interop Public Class xlTest Public xlApp As Excel.Application Sub DoBackgroundStuff() MsgBox ("DoBackgroundStuff() says: " & xlApp.Version) End Sub Sub New() xlApp = New Excel.Application MsgBox ("New() says: " & xlApp.Version) Dim t As New System.Threading.Thread(AddressOf DoBackgroundStuff) t.Start() Do While t.IsAlive […]

使用multithreading的excel文件工作时出错

在Asp.net中使用以下代码通过Excel Interop使用multithreading时: Public Class ImportService Public Function ImportsFiles(ByVal files as list(Of String)) Dim rowEffect As Integer = 0 For j as Integer=0 to files.Count-1 dim fileAddress=files(j) Dim app As New Application Dim Wbook As Workbook Try Wbook = app.Workbooks.Open(fileAddress, [ReadOnly]:=True) For i As Integer = 1 To Wbook.Sheets.Count If Not Wbook.Sheets(i).Name.ToString.ToLower.Contains("partial read of load profile") […]

可以在multithreading中对Excel表进行sorting?

我的代码如下: Parallel.ForEach(listSheets, (xlWorkSheet1) => { // Excel.Worksheet xlWorkSheet1 = (Excel.Worksheet)excelbk.Worksheets["Sheet1"]; xlRange = (Excel.Range)xlWorkSheet1.Cells[xlWorkSheet1.Rows.Count, 1]; lock (xlRange) { // nRows = (long)xlRange.get_End(Excel.XlDirection.xlUp).Row; nRows = xlWorkSheet1.UsedRange.Cells.Rows.Count; xlRange = (Excel.Range)xlWorkSheet1.Rows["5:" + nRows, Type.Missing]; xlRange.Sort(xlRange.Columns[clnum1, Type.Missing], Excel.XlSortOrder.xlAscending, xlRange.Columns[clnum2, Type.Missing], Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlNo, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlStroke, Excel.XlSortDataOption.xlSortTextAsNumbers, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal); Console.WriteLine("Sheet{0} have been sorted", xlWorkSheet1.Name); } } listSheets被定义为一个List,当我debugging它时,它显示错误,COMexception,该问题已经运行。 […]

并发和multithreadingexcel vba

所以我在网上search和大部分答案我说,Excel中没有并发。 但是有些post说EXCEL 2007提供了multithreading来加速计算。 我真的很困惑,可能吗? 在我的工作簿中,有一些单元格是使用用户定义的函数进行计算的。 这些单元格每秒通过RTD服务器更新一次。 那么这是否意味着这些函数似乎被重新计算并行,但事实上,Excel只是按顺序安排它们呢? 如果电脑有多个内核,它会有所作为吗? 如果实际上这些function是按顺序运行的话,那么下面的两个function是否相同呢? 在性能和速度方面。 1) cell1 = userFunc(1, switch1) cell2 = userFunc(2, switch2) cell3 = userFunc(2, switch3) 和2) cell = func() where func() is public function if(switch1) call userfunc1 if(switch2) call userfunc2 …. end function 让我们假设所有必要的function调整。 我的意思是,第一个会更快吗? 非常感谢!!! 更新:所以如果在VBA中没有真正的并发性,那么这是否意味着函数被顺序调用,并且共享全局variables可以被访问而没有locking问题? 我有一个几乎每个函数都使用的API对象,所以我可以共享它,而不是每次使用它时初始化它? 这个对象只是一个用来调用一些静态函数的API,对象本身没有任何修改或任何东西。

使用Windows窗体closures子线程更新excel文件; 返回受影响的行,但文件不更新

我正在编写一个窗体窗体应用程序(也有一个控制台附加到它的debugging线程),使我可以select一个Excel文件,并对所述文件执行操作。 该文件包含交易信息,如[date],[存储],[部门]等。 这个项目的整个目标是把每个工作分解成线程。 有四个主要工作。 1 :)拉下一个未受影响的Excel文件行并更新它。 2 :)查看数据库中的excel事务,并将生成的对象添加到内存中的列表中。 3 :)处理从数据库中提取的事务。 4 :)处理后用笔记更新excel文件。 这四个工作中的每一个都将有一个线程,除了3.这将完成主线程。 在结束会话之前,我等待线程join备份。 所以如果_Processing = false,它仍然会等待所有更新完成保存,然后再继续。 我的主要方法首先运行一个清理工作来设置任何被拉入内存但未处理的事务。 这是一个简单的方法,没有线程,只运行一个命令。 ('UPDATE [MissingTransactions $] SET Notes =''WHERE Notes ='Pulled')。 这是因为当我拉事务时,我设置Notes ='Pulled',如果作业失败,我希望这些设置为空string。 当我尝试更新文件以从主线程的子线程设置Notes ='Pulled'时,问题就会起作用。 这是我的更新方法。 这是我如何build立我的命令; 我在这一个方法中运行两个命令,一个拉和一个更新我拉的事务。 private void GetNextExcelTransaction(ref List<ITransaction> iExcelList) { Console.WriteLine("Pulling Excel Transaction"); OleDbCommand lCommand = new OleDbCommand(Commands.Commands.SelectNextAvailableTransaction); DataTable lNextTransaction = _DataAccess.ExecuteQueryCommand(lCommand, Commands.Commands.SelectNextAvailableTransaction, 0); ITransaction […]