2012-12-05 70 views
0

有些事情告訴我這可能是一個愚蠢的問題,我實際上已經從錯誤的方向接近我的問題,但是在這裏。強制循環包含異步任務,以維護序列

我有一些循環遍歷文件夾中所有文檔的代碼 - 這些文檔在每個文件夾中的字母順序很重要,這一重要性也反映在文檔打印的順序中。這裏是一個簡化的版本:

var wordApp = new Microsoft.Office.Interop.Word.Application(); 

foreach (var file in Directory.EnumerateFiles(folder)) 
     { 
      fileCounter++; 

      // Print file, referencing a previously instantiated word application object 
      wordApp.Documents.Open(...) 
      wordApp.PrintOut(...) 
      wordApp.ActiveDocument.Close(...) 
     } 

看來(我可能是錯的),爲打印輸出代碼是異步的,應用程序有時會進入其中的文件得到打印出來的訂單情況。這被證實是因爲如果我經過一段時間,或者撥打足夠長的電話號碼,所有文件的順序都是正確的。

如何防止下一個打印任務在前一個打印任務完成之前開始?

我最初認爲我可以使用lock(someObject){},直到我記得它們僅用於防止多個線程訪問相同的代碼塊。這一切都在同一線程中。

有一些事件,我可以Microsoft.Office.Interop.Word.Application對象上的鐵絲插入:DocumentOpenDocumentBeforeCloseDocumentBeforePrint

我剛剛想到,這實際上可能是有不能夠準確區分大量文檔的打印隊列中的問題在同一秒內添加。這不可能是問題,可以嗎?

作爲一個附註,此循環位於對象的DoWork事件調用的代碼中。我正在使用它來防止UI阻塞並反饋過程的進度。

回答

1

您的事件處理方法看起來不錯。您可以添加一個處理程序到DocumentBeforeClose事件中,在該事件中您將獲得要打印的下一個文件,將其發送到Word並繼續。事情是這樣的:

List<...> m_files = Directory.EnumerateFiles(folder); 
wordApp.DocumentBeforeClose += ProcessNextDocument; 

... 

void ProcessNextDocument(...) 
{ 
    File file = null; 
    lock(m_files) 
    { 
     if (m_files.Count > 0) 
     { 
      file = m_files[m_files.Count - 1]; 
      m_files.RemoveAt(m_files.Count - 1); 
     } 
     else 
     { 
      // Done! 
     } 
    } 

    if (file != null) 
    { 
     PrintDocument(file); 
    } 
} 

void PrintDocument(File file) 
{ 
    wordApp.Document.Open(...); 
    wordApp.Document.PrintOut(...); 
    wordApp.ActiveDocument.Close(...); 
} 
0

Application.PrintOut第一個參數指定打印是否應該發生在後臺與否。通過將其設置爲false它將同步工作。