C# '由于应用程序正在调度输入同步呼叫,因此无法进行传出呼叫。(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))'
我对C相当陌生,正在尝试为特定功能创建一个web浏览器 我有一个不可见的表单Form1,它将Form2称为浏览器和监视器,以确保Form2始终在运行,如果它处于空闲状态,请关闭并重新打开Form2 我想我有一个线程问题,我设置运行计时器,这是我唯一能解决的方法 我已经确定,当我试图从线程内部调用函数时,它只是无法启动Form2C# '由于应用程序正在调度输入同步呼叫,因此无法进行传出呼叫。(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.
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应用程序不是我的第一选择,但我已经接近终点了,我几乎可以尝到它的味道