C# - 正确地在单独的线程上运行控件或表单

时间:2014-07-21 03:25:36

标签: c# multithreading flash

我正在制作一个程序,一次运行多个Shockwave flash控件。 由于闪存的性质和性能,我无法在同一个UI线程上运行所有控件。

我解决这个问题的方法是创建子窗体,每个窗体都有自己的闪存控件,并在新线程上运行它们。我是通过以下方式做到的:

for (int i = 0; i < numClients; i++)
        {
            Thread clientThread = new Thread(new ThreadStart(() =>
                {
                    FrmClient c = new FrmClient();
                    c.ShowDialog();
                }));
            clientThread.IsBackground = true;
            clientThread.SetApartmentState(ApartmentState.STA);
            clientThread.Start();
        }

然而,这个设置是如此不稳定和hacky甚至不好笑。左右抛出交叉异常。

我正在调用表单来正确访问其成员,但是表单甚至无法在不调用的情况下访问自己的成员,例如:

public partial class FrmClient : Form
{

    public FrmClient()
    {
        InitializeComponent();
        this.Shown += new FormShownEventHandler(Shown);
    }  

    void Shown(object sender, EventArgs e)
    {
         this.WindowState = FormWindowState.Maximized;
         // ^ CrossThreadException

         this.Invoke(new MethodInvoker(() =>
              { 
                   this.WindowState = FormWindowState.Maximized;
              }));
         // Works
     }
 }

只需使用“退出”按钮关闭表单,就会在第一个代码段中使用的ShowDialog()函数中导致交叉线程异常。

我需要知道,有没有其他方法可以实现我的需要?最终,闪存控件需要在不同的线程上运行。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

听起来你想要多个应用领域......

也许这可能会有所帮助......

http://denisvuyka.wordpress.com/2007/10/17/make-a-really-dynamic-plugin-using-multiple-application-domains/