2017-01-19 2 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

Да, наверное, нет. Вы в конечном итоге блокируете поток пользовательского интерфейса, и это заблокирует задание на печать, и вы в конечном итоге зашли в тупик. Лучше [править] и рассказывать нам, что вы делаете и что хотите, и почему вы считаете, что «блокировать» метод является решением. – Will

+3

Возможно, вы могли бы переписать это как асинхронный/ожидающий. Вы, конечно, не хотите блокировать поток пользовательского интерфейса, пока он работает. –

+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() не выполняется -> Я думаю, что событие не уволено, потому что блоки программы на are.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), тогда как в именованном методе вам необходимо явно передать объект. –