2011年10月27日 星期四

#Crystal Report 多執行緒叫用同一rpt報表檔案載入問題


測試 CR報表
目前卡在 開啟瀏覽報表 會提示要求輸入登入資料庫帳密 (之前沒有)
報表 DataSource 是一個 DataTable,應該是不會要求登入資料庫才對啊

@大概知道是因為他找不到登入資料庫的 DataSet
所以在報表上面重新設定好之前訂好的DataSet就可以了

'有點棘手
試著改成直接列印
預覽則直接放在Form上面

所以要拿掉分頁控制

===========================================================
再來就是多執行緒一次多開,會有 "引動過程的目標傳回例外狀況。"
multithreading - 'System.Reflection.TargetInvocationException'


 //若是已經取消背景作業,就不去更新表單資訊,
            //否則會引發 [引動過程目標例外狀況]。

@應該跟我關閉報表畫面後
thread 會被強制關閉之類的問題有關吧

看有沒有辦法說能在關閉報表之後
對thread做安全的關閉動作


@大概發現說
如果用的是全域Form去跑
不管事show,    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog  => 猜測是讀取同一個form,前一個thread還沒結束,下一個thread又呼叫這個form
怎樣都會發生

如果宣告 Form去跑
show 會發生    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog 還是會發生.....
@DisconnectedContext MDA警告?RuntimeCallableWrapper 
關閉報表表單以後,通常會出現這個警告訊息'

應該是跟 報表相關變數資源鏈結沒有適時關閉有關係

目前將呼叫的Thread 設為 STA 單一執行緒
似乎就不會再出現這個問題
要在測試看看


.NET Threading Model(STA and MTA)


STA(single threaded apartments)。apartment只是一个逻辑上的概念,它可以包含一个或多个线程。一个AppDomain可以包括一个或多个apartment。STA是指该apartment中只能包含一个thread。
MTA(multi threaded apartments)。指该apartment中可以包含多个thread。
STA and MTA 之间最大的区别就是MTA 可以在同一个apartment 中使用所有的共享资源并发执行多个线程。 而多个STA虽然可以共享数据,但是不能并发执行线程,存在性能问题。



@多執行緒開啟報表表單
會發生 引動過程目標例外狀況

因為 CrystalDecisions.CrystalReports.Engine.ReportDocument 可能再引用外部程式的時候
會動到某塊記憶體吧

當載入資料以後其他執行緒也跟著補上
又透過同個com元件對該記憶體做事情
而產生例外
@目前透過 將 ReportDocument 宣告為全域變數
以 SyncLock 該報表文件變數

   '載入報表資源動作

   End SyncLock

讓每個 Thread 依序執行載入報表動作


'目前差再說,怎麼把報表載入後的資料在show表單後,才去下次的載入

[.Net] 鎖住物件或Method

在VB.net是在Method宣告的前一行加上:<MethodImpl(MethodImplOptions.Synchronized)> _

沒有留言:

張貼留言