CefSharp中ChromiumWebBrowser中的跨线程调用问题

之前有用ChromiumWebBrowser浏览器唤醒本地窗体。其实在用的时候就发现,存在一点线程使用问题,所以当时用了ShowDialog()方法。但是现在问题又出现了,窗体中还要打开打印窗口,PrintDialog.Show()调用的时候就出错了。

基本可以肯定的是,一定是跨线程调用了。本来想偷懒解决的问题,看来还是需要处理。

处理的方法也无外乎那么几个。

1. CheckForIllegalCrossThreadCalls设置为false

2. 通过Delegate来访问

3. BackgroudWorker之类的后台线程对象。

1肯定不是什么好办法,当然最简单。

3太麻烦了

所以还是用2吧。

问题是,我是通过注册到JS页面的类来调用窗体的Show(),这时候获取不到一个UI线程啊。

所以直接在Program中,定义了一个public static Form1 main;

这样的全局对象,我的系统里目前只是一个主窗体,不会出现两个。时间关系,问题出现在解决。

然后

main = new Form1();

Application.Run(main);

这样在我注册的类对象中,就能通过Program.main获取主窗体了。

修改代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KaKaFormClient
{
    class SendCarBillPrint
    {
        public string sendcode { set; get; }
        delegate void ShowFormCallBack();

        private void ShowForm()
        {
            if(Program.main.InvokeRequired)
            {
                ShowFormCallBack cb = new ShowFormCallBack(ShowForm);
                Program.main.Invoke(cb);
            }
            else
            {
                SendCarPrintForm form = new SendCarPrintForm();
                form.sendcode = sendcode;
                form.Show(Program.main);
            }
        }
        public void showtest()
        {
            ShowForm();
        }
    }
}

这样就能够通过主窗体UI线程来唤醒新窗体了,解决了之前跨线程调用问题。

对了,直接Show()的话,窗体能打开,但是打开后卡死。ShowDialog()倒是没有问题。如果不需要再唤醒其他窗体的话。


你可能感兴趣的:(WinForm)