单独线程中的多个表单

时间:2012-03-24 23:27:22

标签: c# .net winforms multithreading

我试图在C#中使用Windows窗体运行ATM模拟,该窗体可以有多个ATM机实例同时与银行账户进行交易。

我们的想法是使用信号量/锁定来阻止可能导致竞争条件的关键代码。

我的问题是:

如何在不同的线程上同时运行两个表单?特别是,所有这些如何适应已经存在的Application.Run()

这是我的主要课程:

public class Bank
{
    private Account[] ac = new Account[3];
    private ATM atm;


    public Bank()
    {
        ac[0] = new Account(300, 1111, 111111);
        ac[1] = new Account(750, 2222, 222222);
        ac[2] = new Account(3000, 3333, 333333);


        Application.Run(new ATM(ac));


    }

    static void Main(string[] args)
    {
        new Bank();
    }
}
...that I want to run two of these forms on separate threads...

public partial class ATM : Form
{
    //local reference to the array of accounts
    private Account[] ac;

    //this is a reference to the account that is being used
    private Account activeAccount = null;

    private static int stepCount = 0;

    private string buffer = "";

    // the ATM constructor takes an array of account objects as a reference
    public ATM(Account[] ac)
    {
        InitializeComponent();  //Sets up Form ATM GUI in ATM.Designer.cs
        this.ac = ac;
    }
...

我尝试过使用

Thread ATM2 = new Thread(new ThreadStart(/*What goes in here?*/));

但是我在ThreadStart构造函数中放了什么方法,因为ATM表单是事件驱动的,并且没有一种方法可以控制它?

编辑:

我尝试用

替换Application.Run(new ATM(ac));
ATM atm1 = new ATM(ac);
ATM atm2 = new ATM(ac);
Thread ATM2_T = new Thread(new ThreadStart(atm1.Show));
Thread ATM1_T = new Thread(new ThreadStart(atm2.Show));
ATM1_T.Start();
ATM2_T.Start();

在Bank构造函数中。没有显示任何内容,程序会从Main()函数的末尾掉落。

3 个答案:

答案 0 :(得分:8)

以下是我认为您需要做的事情:

Thread ATM2 = new Thread(new ThreadStart(ThreadProc));
ATM2.Start();

它称之为:

private void ThreadProc()
{
    var frm = new ATM();
    frm.ShowDialog();
}

答案 1 :(得分:0)

Bank.Main()中,尝试将Application.Run(new ATM(acc))new ATM(acc).Show()重新展开。您可以根据需要多次使用Form.Show()方法。如果我没记错的话,应用程序将在所有表单关闭时关闭(虽然我可能会弄错 - 尝试使用VS调试器)

答案 2 :(得分:0)

以上是不安全的代码

请找到线程安全代码:

Thread ATM2 = new Thread(new ThreadStart(ThreadProc));
ATM2.Start();

它称之为:

private void ThreadProc()
{
    if(InvokeRequired)
    {
        this.Invoke(new Action(() => CreateAndShowForm()));
        return;
    }
    CreateAndShowForm();

}

private void CreateAndShowForm()
{
    var frm = new ATM();
    frm.ShowDialog();
}