2017-01-19 44 views
1

被解僱,我有以下事件&功能:等待一個事件的功能

static void rViewer_DocumentLoaded(object sender, EventArgs e) 
    { 
     //Do something 
    } 

    static RadPdfViewer rViewer = new RadPdfViewer(); 
    static RadPrintDocument rpd = new RadPrintDocument(); 

    internal static bool PrintReportBlocking(string sFileName, REPORT_TYPE reportType)  
    { 
     try 
     { 

      rpd = new RadPrintDocument(); 
      rViewer = new RadPdfViewer(); 
      rViewer.LoadDocument(sFileName); 
      rViewer.DocumentLoaded += rViewer_DocumentLoaded; 

      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 

我的目標是在功能阻止,直到事件被激發。

+5

呀,大概沒有。您最終會阻止UI線程,並且會阻止打印作業,最終會導致死鎖。更好地[編輯]並告訴我們你在做什麼,你想要發生什麼,以及爲什麼你認爲「阻止」該方法是一種解決方案。 – Will

+3

您可能可以將其重寫爲異步/等待的事情。你當然不想在UI工作時阻塞UI線程。 –

+0

「PrintReportBlocking」函數可以連續調用5次,問題是該事件正在被覆蓋,並且打印機將打印相同的文檔5次。 – xileb0

回答

-1

您可以使用的AutoResetEvent:

static void rViewer_DocumentLoaded(object sender, EventArgs e) 
{ 
    are.Set(); 
    //Do something 
} 

static RadPdfViewer rViewer = new RadPdfViewer(); 
static RadPrintDocument rpd = new RadPrintDocument(); 
static AutoResetEvent are = new AutoResetEvent(false); 
internal static bool PrintReportBlocking(string sFileName, REPORT_TYPE reportType) 
{ 
    try 
    { 

     rpd = new RadPrintDocument(); 
     rViewer = new RadPdfViewer(); 
     rViewer.DocumentLoaded += rViewer_DocumentLoaded; 
     rViewer.LoadDocument(sFileName); 
     are.WaitOne(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 
+0

我嘗試過這樣,但事件從來沒有被解僱,當我這樣做。這是WinForms中的問題嗎? – xileb0

+0

我不熟悉RadPdfViewer。您是否嘗試在AutoResetEvent的設置上設置斷點以嘗試查看代碼是否被執行? –

+0

are.Set()沒有執行 - >我認爲這個事件沒有被觸發,因爲程序在is.WaitOne()處阻塞 – xileb0

-1

您可以使用TaskCompletionSource來實現這一目標:

static RadPdfViewer rViewer = new RadPdfViewer(); 
static RadPrintDocument rpd = new RadPrintDocument(); 

internal static bool PrintReportBlocking(string sFileName, REPORT_TYPE reportType)  
{ 
    var tcs = new TaskCompletionSource<object>(); 
    try 
    { 
     rpd = new RadPrintDocument(); 
     rViewer = new RadPdfViewer(); 
     rViewer.DocumentLoaded +=() => tcs.SetResult(null); 
     rViewer.LoadDocument(sFileName); 

     // If you really want to block, but you should probably use async/await 
     tcs.Task.Wait(); 

     return true; 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 
+0

我不太明白這一點。 DocumentLoaded-Event綁定在哪裏? – xileb0

+0

()=> tcs.SetResult(null)是一個閉包,它與您的rViewer_DocumentLoaded類似,只是隱式訪問父變量(tcs),而在命名方法中,您需要顯式傳遞目的。 –