2015-11-12 57 views
3

我想不出一種方式來做這樣的事情:我有一個C#應用程序與使用串行端口的另一個設備進行連接,並且此設備有時可能會有中斷,從而阻止自身的執行,但一旦它被修復,操作會一直持續到完成。在執行阻塞方法時返回數據

例如,考慮一臺打印機,一個100頁的作業開始在打印機上打印,但打印機內部有70張紙,因此打印機打印70頁,然後通過PC警告用戶將更多紙張放入托盤。用戶在其中放入紙張後,繼續打印,並在打印輸出結束後,打印機將結果發送至PC。

多數民衆贊成的情況,但比打印機發生得更快。我怎樣才能編碼這樣的東西?例如:

private void StartPrinting() 
{  
    boolean bIsPrinted = SendPrinterDocument("p100.pdf"); 
} 

private void ShowPaperOutError() 
{ 
    MessageBox.Show("Paper is out. Please load some papers"); 
} 

如果你只有這SendPrinterDocument()方法,並應用它會阻止執行,就像是一個DLL庫,你會如何觸發ShowPaperOutError()消息?僅供參考,我可以訪問所有代碼,PC軟件(C#),DLL(C#)和設備(C),並且可以編譯它們。

+0

你的'ShowPaperOutError'是如何調用的?通過一個事件? –

+0

尚未調用:)我試圖在保持活動狀態的同時找到合理的方式來調用它。 –

回答

4

您可以通過讓SendPrinterDocument返回一個引發適當事件的對象,並可能暴露適當的方法來執行您所需的操作。

我將使用(半)僞代碼,因爲我無法看到所有代碼,你說你有權訪問並可以改變 - 我假設你將能夠實現這個想法。

public interface ISendPrinterDocumentResponse 
{ 
    event EventHandler PrintingFinished; 
    event EventHandler<PrintingInterruptedEventArgs> PrintingInterrupted; 
    void Retry(); 
} 

public class PrintingInterruptedEventArgs: EventArgs 
{ 
    public string Reason { get;set; } 
} 

你將能夠使用它,例如:

如果SendPrinterDocument與實現這個例子接口的對象返回立刻

var response = SendPrinterDocument("p100.pdf"); 
response.PrintingFinished = (s,ea) => MessageBox.Show("Finished"); 
response.PrintingInterrupted = (s,ea) => { 
    MessageBox.Show("Printing stopped, hit ok to retry (reason:" + ea.Reason + ")"); 
    response.Retry(); 
}; 

編輯,基於評論:

上面的想法很快就會打破,如果你的實際al功能足夠快,以至於在實際分配事件處理程序之前完成,在這種情況下,您可能需要第二個參數作爲函數,它提供了一些「回調」,在發生相關事件時會調用它們。您可以使用相同的設置:

public void SendPrinterDocument(string documentName, ISendPrinterEvents events); 
{ 
    // when interrupted 
    if(events.PrintingInterrupted != null) 
    { 
      events.PrintingInterrupted(this, new PrintingInterruptedEventArgs{Reason = "Out of paper"}); 
    } 
} 
+2

對我來說似乎很合理,但是您的代碼有問題。如果在「PrintingFinished」被分配之前打印完成,該怎麼辦?在實際打印之前,我會將這些東西提供給打印方法。 –

+0

是的,我認爲你可能是對的 - 這就是爲什麼這是更多的「想法」,而不是實際的實施。對於長時間運行的任務(如打印),這種方式通常可以正常工作,對於更快的事情,將事件處理程序分配給響應的意義不大。這是基於OP的功能實際*做的調用 – Jamiec

+0

是的,該事件處理程序的想法似乎合理和實用的將中斷從dll傳輸到外部世界。我會給這個鏡頭。謝謝。 –