如何使用参数对函数方法进行排队并逐个运行?

时间:2016-12-11 09:03:05

标签: c# multithreading linq

我正在尝试构建一个类似临时的应用程序来模拟基于块的编程方法。我希望用户将命令添加到命令池(队列)并在用户单击“运行”按钮时按顺序运行它们。

我在互联网上进行了研究,发现行动清单可以排队。

ScreenShot of the form

    //Global Variables

    List<Int32> NumberOfSteps = new List<Int32>();
    List<Int32> NumberOfDegrees = new List<Int32>();
    List<Int32> GlideXPos = new List<Int32>();
    List<Int32> GlideYPos = new List<Int32>();
    List<String> SayList = new List<String>();
    List<String> SoundList = new List<String>();


    List<Action> queue = new List<Action>();



    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void textBox7_TextChanged(object sender, EventArgs e)
    {

    }

    private static Bitmap RotateImageByAngle(Image oldBitmap, float angle)
    {
        var newBitmap = new Bitmap(oldBitmap.Width, oldBitmap.Height);
        var graphics = Graphics.FromImage(newBitmap);
        graphics.TranslateTransform((float)oldBitmap.Width / 2, (float)oldBitmap.Height / 2);
        graphics.RotateTransform(angle);
        graphics.TranslateTransform(-(float)oldBitmap.Width / 2, -(float)oldBitmap.Height / 2);
        graphics.DrawImage(oldBitmap, new Point(0, 0));
        return newBitmap;
    }

    private void button3_Click(object sender, EventArgs e)
    {

         pictureBox1.Image = RotateImageByAngle(pictureBox1.Image, 30);

    }

    private void button1_Click(object sender, EventArgs e)
    {
        queue.Add(() => { HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text)); });

    }

    private void HAREKETETTIR(int miktar)
    {
        deneme2 += miktar;
        Point deneme = new Point(deneme2, 455);
        pictureBox1.Location = deneme;

    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {

    }


    private void btnRotate_Click(object sender, EventArgs e)
    {
        queue.Add(() => { HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text)); });

    }

    private void RUN_Click(object sender, EventArgs e)
    {
        foreach (Action item in queue)
        {
            item();
        }
    }
}

当我单击“运行”时,代码会创建一个错误,因为“输入字符串的格式不正确。”

我如何在这里解决问题?

由于

2 个答案:

答案 0 :(得分:2)

您的问题不包含信息,程序的哪一部分会产生错误,但可能是Convert.ToInt32(txtNumberOfSteps.Text)。

错误的第一个原因可能是txtNumberOfSteps.Text不包含可转换为整数的文本,因此请确保用户只能输入有效的整数或提供适当的错误处理(例如,在排队操作之前检查txtNumberOfSteps.Text并显示用户一些错误消息)。

第二个原因更难以发现。如果您将Action添加到此队列

queue.Add(() => { HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text)); });

然后方法 Convert.ToInt32()会尝试将txtNumberOfSteps.Text的值转换为您运行操作时的值,而不是排队操作时的值。因此,例如,如果用户在txtNumberOfSteps.Text包含&#34; 2&#34;然后他将txtNumberOfSteps.Text更改为空字符串并在队列中运行操作,您将收到错误,因为空字符串不是有效整数。这可以通过在排除动作的瞬间创建包含txtNumberOfSteps.Text中的值副本的临时变量来轻松修复。

private void button1_Click(object sender, EventArgs e)
{
    var text = txtNumberOfSteps.Text;
    queue.Add(() => { HAREKETETTIR(Convert.ToInt32(text)); });
}

(同样的问题出在 btnRotate_Click()方法中。)

您可以更详细地了解此问题here

答案 1 :(得分:0)

在我看来,你的错误是因为txtNumberOfSteps.Text实际上是一个无效的数字。您正在将操作正确添加到队列中,并在我看到的情况下正确运行它们。