window c#application作为任务调度程序运行

时间:2014-06-16 11:15:31

标签: c#

我有一个带有一个按钮的Windows应用程序,并希望它是自动的,即运行任务计划程序而不是手动按下按钮。我这样做的时候会收到这个错误。索引超出了数组的范围。

这是我的代码。

private void button1_Click(object sender, EventArgs e)
{
    this.Process1();
}

public void Process1()
{
    dialog = new SaveFileDialog();
    dialog.Title = "Save file as...";
    dialog.Filter = "XML Files (*.xml)|*.xml";
    dialog.RestoreDirectory = true;
    //dialog.InitialDirectory = @"v:\";

    //blah blah blah...... code here..
}

点** ** rogram.cs

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    //Application.Run(new Form1());
    Form1 form = new Form1();

    String[] arguments = Environment.GetCommandLineArgs();
    if (arguments.Count() >= 1) 
    {
        // next line shows up the error
        Int16 valueArgument = Int16.Parse(arguments[1]);// <--- 

        switch(valueArgument)
        {
            case 1 :
                form.Process1();
                break;      
        }
    }
    // ...

这适用于另一个带有11个按钮的应用程序。这里我只有一个按钮可以运行但失败了。

2 个答案:

答案 0 :(得分:1)

如果您有1个参数,则arguments[1]将不存在。要获得第一个参数,请使用arguments[0]

正如@ActiveHigh在评论中指出的那样,第一个参数将始终是正在执行的程序的文件名(请参阅Environment.GetCommandLineArgs文档中的备注部分。

这意味着您没有传递命令行参数。它还建议您将参数计数检查更新为&gt; 1而不是&gt; = 1,因为这个条件总是为真。

答案 1 :(得分:0)

您的程序有很多错误。我尽可能地指出了 -

  1. Windows Form ApplicationConsole Application的工作方式不同。对于控制台,一旦退出Main,程序将退出。这就是您的代码中现在发生的事情。要使Windows窗体应用程序无限期运行,您必须从Application.Run获取帮助,我看到您已注释掉了。所以程序将运行并退出。

  2. 第二个错误是 -

    String[] arguments = Environment.GetCommandLineArgs();arguments是一个数组,因此它没有Count()方法。您应该使用arguments.Length

  3. 您必须致电ShowDialog以显示对话框。

  4. 如果你想要一些工作,你必须至少解决这个问题。更好,而不是使用main方法,将所有参数传递给表单,然后在表单中执行任何操作 -

    表格 -

        public Form1()
        {
            InitializeComponent();
            this.Shown += (s, e) => {
                String[] arguments = Environment.GetCommandLineArgs();
                if (arguments.Length > 1)
                {
                    Int16 valueArgument = Int16.Parse(arguments[1]); 
                    switch (valueArgument)
                    {
                        case 1:
                            this.Process1();
                            break;
                    }
                }
            };
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            this.Process1();
        }
    
        public void Process1()
        {
            var dialog = new SaveFileDialog();
            dialog.Title = "Save file as...";
            dialog.Filter = "XML Files (*.xml)|*.xml";
            dialog.RestoreDirectory = true;
            dialog.ShowDialog(this);
            //dialog.InitialDirectory = @"v:\";
    
            //blah blah blah...... code here..
        }
    

    和Program.cs -

    static class Program
    {
        [STAThread]
        static void Main()
        {
            var handleCreated = new ManualResetEvent(false);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
    
      

    另请注意 - Application.Run是一个阻止调用。编写任何代码   此调用之后只会在调用的表单退出后执行。