2015-02-24 28 views
1

我在winforms中使用CefSharp 37。我已經實現了IRequestHandler,並且想要在方法OnBeforeResourceLoad中編寫一些ResourceHandler代碼。給所有者MessageBox從另一個線程調用

in OnBeforeResourceLoad()我檢查一些條件,並在此基礎上顯示一個帶有OK和Cancel按鈕的MessageBox。按Cancel我想返回true,否則返回false。代碼如下:

public bool OnBeforeResourceLoad(IWebBrowser browser, IRequest request, IResponse response) 
    {    
      if (!request.Url.Contains(ContentHelper.requestTrapKey) 
      {      
       var handler = browser.ResourceHandler; 
       if (handler != null) 
       { 
        handler.RegisterHandler(request.Url, ResourceHandler.FromStream(File.OpenRead(ContentHelper.contentRootPath), Path.GetExtension(ContentHelper.contentRootPath + final));       
       } 
      } 
      else if (!request.Url.Contains(ContentHelper.requestTrapKey + "course") && request.Url.Contains(ContentHelper.requestTrapKey)) 
      {      
       if (MessageBox.Show("message", "title", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Cancel) 
       { 
        return true; 
       }     
      } 

     return false; 
    } 

據觀察,有時MessageBox()去背後的主要形式和用戶等待消息框也來和旁邊還碼在等待狀態來執行。我知道,因爲MessageBox.Show()在主線程之外的其他線程上調用,所以這就是爲什麼它會落後。

那麼有沒有什麼辦法可以向用戶展示MessageBox或給用戶一條消息,而不必將其放在後面並從用戶那裏接受輸入,並相應地返回true或false來加載資源。

更新

我嘗試作爲@Adil回答說:通過MethodInvoker包裹代碼,然後MessageBox停留在形式的頂部,但作爲當我按在消息框中應用程序的任何按鈕,得到忌用。

我寫MyRequestHandler類的參數化的構造函數:

public MyRequestHandler(MainForm mainform) 
    { 
     this.mainform = mainform; 
    } 

然後由@Adil說:

bool returnValue = false; 
mainform.Invoke((MethodInvoker)(() => 
{ 
    if (MessageBox.Show(mainform,"message", "title", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Cancel) 
    { 
     returnValue = true; 
    } 
})); 
return returnValue; 

回答

3

我係有檢查的MainForm的InvokeRequired但仍然是 拋出同樣的異常。

您不僅需要檢查InvokeRequired,但需要在GUI線程上調用。你可以使用MethodInvoker來做到這一點。

如果您有MethodInvoker委託人的退貨,它將從代理人而不是具有MethodInvoker的方法返回。您可以將某個布爾變量的值設置爲true,您可以在委託完成其執行後使用返回

bool returnValue = false; 
mainform.Invoke((MethodInvoker)(() => 
{ 
    if (MessageBox.Show(mainform,"message", "title", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Cancel) 
    { 
     returnValue = true; 
    } 
})); 
return returnValue; 
+0

是否有必要將此代碼保存在'if'中,以檢查'mainform.InvokeRequired'? – Amogh 2015-02-24 10:34:54

+0

它不是必須的,但如果你這樣做,你將得到很少的性能好處,因爲如果InvokeRequired是假的,你將有更少的代碼執行。 – Adil 2015-02-24 10:38:53

+0

好吧我用'if'包圍了代碼,但是我觀察到3-2'MessageBox'應用程序被掛起後,爲什麼?如果我從'MessageBox'中刪除所有者對象(mainform),那麼所有工作都可以正常工作,但有時MessageBox會返回到主窗口,因爲在其他線程上調用MessageBox.Show()。 – Amogh 2015-02-24 11:05:51

相關問題