我使用以下功能关闭现有表单并打开新表单。 当代码尝试关闭现有表单时,我收到以下错误
错误:
{System.InvalidOperationException:跨线程操作无效:控制'屏幕保护程序'从其创建的线程以外的线程访问。
代码:
public static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
StartThread();
Application.Run(new MyContext(new Screensaver()));
}
public class MyContext : ApplicationContext
{
static private Form curMain = null;
public MyContext(Form main)
{
MyContext.NewMainForm(main, false);
}
static public void NewMainForm(Form main, bool ClosePreviousMain)
{
try
{
if (main != null)
{
if (ClosePreviousMain & MyContext.curMain != null)
{
MyContext.curMain.FormClosed -= new FormClosedEventHandler(main_FormClosed);
MyContext.curMain.Close();
}
MyContext.curMain = main;
MyContext.curMain.FormClosed += new FormClosedEventHandler(main_FormClosed);
MyContext.curMain.Show();
}
}
catch (Exception ex)
{
ExceptionHandler.writeToLogFile(System.Environment.NewLine + "Message : " + ex.Message.ToString() + System.Environment.NewLine + "Stack : " + ex.StackTrace.ToString());
}
}
static private void main_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
}
答案 0 :(得分:2)
我猜想MyContext.curMain
是指在另一个线程上创建的表单,而不是您在尝试关闭它时正在执行的线程(调用StartThread();
,并且异常消息指示有一些线程正在进行中)。所有在MyContext.curMain
中执行任何方法的尝试都必须在创建它的线程上执行。这是通过使用Invoke
或BeginInvoke
来实现的:
MyContext.curMain.Invoke(new Action(MyContext.curMain.Close));