我在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;
是否有必要將此代碼保存在'if'中,以檢查'mainform.InvokeRequired'? – Amogh 2015-02-24 10:34:54
它不是必須的,但如果你這樣做,你將得到很少的性能好處,因爲如果InvokeRequired是假的,你將有更少的代碼執行。 – Adil 2015-02-24 10:38:53
好吧我用'if'包圍了代碼,但是我觀察到3-2'MessageBox'應用程序被掛起後,爲什麼?如果我從'MessageBox'中刪除所有者對象(mainform),那麼所有工作都可以正常工作,但有時MessageBox會返回到主窗口,因爲在其他線程上調用MessageBox.Show()。 – Amogh 2015-02-24 11:05:51