0

我正在使用 LinuxMint 和 MonoDevelop 开发 C# 应用程序。
我写了下一个代码,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace TestProgram
{
    public static class Program
    {
        public static int count = 0;
        static object locker = new object();

        const int limit = 10;

        [STAThread]
        static void Main()
        {
            for(int i = 0; i < Program.limit; ++i)
            {   
                Action item = () => Program.RunForm();
                item.BeginInvoke((a) => item.EndInvoke(a), null);
                Thread.Sleep(1000);
            }

            while(true)
            {
                Thread.Sleep(1000);
                if(Program.count == 0)
                    break;
            }

            return;
        }

        static void RunForm()
        {   
            lock(Program.locker) {
                Program.count += 1;
            }

            Application.EnableVisualStyles();
            Application.Run(new Form());

            lock(Program.locker) {
                Program.count -= 1;
            }
        }
    }
}

在 DotNET 中,该程序运行良好。10 个窗口正确显示。
在 Mono 中,程序在没有托管异常的情况下崩溃。
当第 2 个、第 3 个或以后的窗口出现时,它突然崩溃。

这是单声道的错误吗?还是代码错了?
为什么行为不一样?

(请原谅我糟糕的英语。)

4

1 回答 1

5

该代码应该(并且将,对于操作系统和 .NET 的某些组合)在 Microsoft .NET 上的 Windows 上也会中断。您应该只在单个线程上创建表单,并且绝对不应该Application.Run()多次调用!

于 2012-08-05T22:36:36.270 回答