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

C# 如何使用参数对函数方法进行排队并逐个运行它们?,c#,multithreading,linq,C#,Multithreading,Linq,我正在尝试构建一个类似于scratch的应用程序来模拟基于块的编程方法。我希望用户将命令添加到命令池(队列),并在用户单击“运行”按钮时按顺序运行它们 我在互联网上研究发现,通过行动列表排队是可行的 //全局变量 List NumberOfSteps=新列表(); List NumberOfDegrees=新列表(); List GlideXPos=新列表(); List GlideYPos=新列表(); List SayList=新列表(); List SoundList=新列表(); 列表

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

我在互联网上研究发现,通过行动列表排队是可行的

//全局变量
List NumberOfSteps=新列表();
List NumberOfDegrees=新列表();
List GlideXPos=新列表();
List GlideYPos=新列表();
List SayList=新列表();
List SoundList=新列表();
列表队列=新列表();
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
}
私有void textBox7_TextChanged(对象发送方,事件参数e)
{
}
专用静态位图RotateImageByAngle(图像旧位图、浮动角度)
{
var newBitmap=新位图(oldbimat.Width、oldbimat.Height);
var graphics=graphics.FromImage(newBitmap);
graphics.TranslateTransform((float)oldp位图.Width/2,(float)oldp位图.Height/2);
图形.旋转变换(角度);
graphics.TranslateTransform(-(浮点)oldBitmap.Width/2,-(浮点)oldBitmap.Height/2);
DrawImage(旧位图,新点(0,0));
返回newBitmap;
}
私有无效按钮3\u单击(对象发送者,事件参数e)
{
pictureBox1.Image=旋转图像按角度(pictureBox1.Image,30);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Add(()=>{HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text));});
}
私人空旷酒店(国际米克塔尔酒店)
{
deneme2+=miktar;
点deneme=新点(deneme2,455);
pictureBox1.Location=deneme;
}
私有无效图片单击(对象发送方,事件参数e)
{
}
私有void btnRotate\u单击(对象发送者,事件参数e)
{
Add(()=>{HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text));});
}
私有无效运行\u单击(对象发送方,事件参数e)
{
foreach(队列中的操作项)
{
项目();
}
}
}
当我单击Run时,代码会创建一个错误,因为“输入字符串的格式不正确。”

我怎样才能解决这个问题呢


谢谢

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

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

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

第二个原因更难发现。如果您像这样向队列添加操作

queue.Add(() => { HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text)); });
然后,Convert.ToInt32()方法将尝试按运行操作时的状态转换txtNumberOfSteps.Text的值,而不是按操作排队时的状态。例如,如果用户在txtNumberOfSteps.Text包含“2”时将一个操作排队,然后他将txtNumberOfSteps.Text更改为空字符串并在队列中运行操作,您将收到错误,因为空字符串不是有效的整数。这可以很容易地通过创建临时变量来解决,该临时变量在执行操作时包含txtNumberOfSteps.Text中的值副本

private void button1_Click(object sender, EventArgs e)
{
    var text = txtNumberOfSteps.Text;
    queue.Add(() => { HAREKETETTIR(Convert.ToInt32(text)); });
}
(btnRotate_Click()方法也存在同样的问题)


您可以更详细地了解这个问题。

@user2394800:我很乐意帮助您,所以请不要忘记将答案标记为已接受,因为它位于StackOverflow上。
private void button1_Click(object sender, EventArgs e)
{
    var text = txtNumberOfSteps.Text;
    queue.Add(() => { HAREKETETTIR(Convert.ToInt32(text)); });
}