C# '由于应用程序正在调度输入同步呼叫,因此无法进行传出呼叫。(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))'

C# '由于应用程序正在调度输入同步呼叫,因此无法进行传出呼叫。(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))',c#,C#,我对C相当陌生,正在尝试为特定功能创建一个web浏览器 我有一个不可见的表单Form1,它将Form2称为浏览器和监视器,以确保Form2始终在运行,如果它处于空闲状态,请关闭并重新打开Form2 我想我有一个线程问题,我设置运行计时器,这是我唯一能解决的方法 我已经确定,当我试图从线程内部调用函数时,它只是无法启动Form2 using System; using System.Threading.Tasks; using System.Windows.Forms; using System.

我对C相当陌生,正在尝试为特定功能创建一个web浏览器 我有一个不可见的表单Form1,它将Form2称为浏览器和监视器,以确保Form2始终在运行,如果它处于空闲状态,请关闭并重新打开Form2

我想我有一个线程问题,我设置运行计时器,这是我唯一能解决的方法

我已经确定,当我试图从线程内部调用函数时,它只是无法启动Form2

using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using Browselite;
using System.Diagnostics;
using System.Threading;

namespace BrowseLite
{

    public partial class Form1 : Form
    {
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool SetProcessDPIAware();

        public static Boolean IdleTimeoutEnabled { get; private set; }
        public static int IdleTimeout { get; private set; }
        public static Boolean ClearRunning { get; private set; }
        public Form2 Browser { get; private set; }
        public static Boolean programmaticClose { get; set; }
        public static Boolean Form2Open { get; set; }

        public Form1()
        {
            InitializeComponent();

        }


        [DllImport("user32.dll")]
        public static extern Boolean GetLastInputInfo(ref tagLASTINPUTINFO plii);
        public struct tagLASTINPUTINFO
        {
            public uint cbSize;
            public Int32 dwTime;

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                using (RegistryKey RootKey = Registry.CurrentUser.OpenSubKey("Software\\Policies\\BrowseLite"))
                {
                    try
                    {

                        Form1.IdleTimeout = Int32.Parse(RootKey.GetValue("IdleTimeout", -1, RegistryValueOptions.None).ToString());
                        if (Form1.IdleTimeout <= 0)
                        {
                            Form1.IdleTimeoutEnabled = false;
                        }
                        else
                        {
                            Form1.IdleTimeoutEnabled = true;
                        }
                    }
                    catch
                    {
                        Form1.IdleTimeout = 0;
                        Form1.IdleTimeoutEnabled = false;
                    }

                }
            }
            catch
            {
                Form1.IdleTimeout = 0;
                Form1.IdleTimeoutEnabled = false;
            }


            Thread Timer = new Thread(new ThreadStart(MyTimer));

            Browser = new Form2();
            OpenBrowser();

            Timer.Start();
        }

        private void MyTimer()
        {
            while (true)
            {
                FormCollection OpenForms = Application.OpenForms;
                foreach (Form OpenForm in OpenForms)
                {
                    if (OpenForm.Name.Contains("Form2"))
                    {
                        Form1.Form2Open = true;
                    }
                }
                if (!Form1.Form2Open)
                {
                    Browser.ShowDialog();
                    Form1.Form2Open = true;
                }


                tagLASTINPUTINFO LastInput = new tagLASTINPUTINFO();
                Int32 IdleTime;
                LastInput.cbSize = (uint)Marshal.SizeOf(LastInput);
                LastInput.dwTime = 0;

                if (GetLastInputInfo(ref LastInput))
                {
                    IdleTime = System.Environment.TickCount - LastInput.dwTime;
                    int IdleTimeSet = IdleTimeout * 60 * 1000;
                    if (Form1.IdleTimeoutEnabled)
                    {
                        if (IdleTime >= IdleTimeSet)
                        {
                            if (Form1.ClearRunning == false)
                            {
                                CloseBrowser();
                                OpenBrowser();
                            }
                        }
                        else
                        {
                            Form1.ClearRunning = false;
                        }
                    }
                }
                Thread.Sleep(1000 * 30); //Time in seconds (30)
            }
        }


        private void CloseBrowser()
        {
            Form1.programmaticClose = true;
            Browser.Close();
        }

        private void OpenBrowser()
        {
            Form1.programmaticClose = false;
            Form1.Form2Open = true;
            Browser.ShowDialog();
        }
    }
}

任何帮助都将不胜感激,但正如我所说。。。我不擅长这一点。

对于其他偶然发现这一点的人,我自己找到了答案

如果在线程中设置变量。而不是使用

表1.运行=真

改用

BeginInvokenew Action=>Form1.Running=true,null

如果从线程内调用函数,请使用

BeginInvokenew InvokeDelegateFUNCTION


这似乎完全解决了我的问题

为什么要使用名为StartTimer的奇怪函数?在无限循环中异步等待async wait Task.Delay1000。为什么不使用法线?这看起来像是XY问题。你到底想做什么?为什么要关闭并重新打开闲置表单?为什么使用浏览器组件而不是普通的浏览器?我不确定最初为什么使用这种方法。我刚刚更新了它,结果还是一样的。我正在为信息亭机器开发浏览器。如果用户离开,需要关闭浏览器并重新打开,以防他们愚蠢地登录到其中一个表单/站点。这是一个特殊的功能。为什么不使用它呢?在这种环境下使用kiosk方法有几个限制,这使得它对我们毫无用处。相信我,我说制作一个c应用程序不是我的第一选择,但我已经接近终点了,我几乎可以尝到它的味道