C# 生成代码在windows窗体中工作不正常
您好,我在windows窗体应用程序中制作了一个程序,以获取我所需的代码。我想在按下提交按钮时将其设置为不阻塞UI 我使用了这些代码。但是我得到了invalidoperationexception是未处理的异常 我试过了C# 生成代码在windows窗体中工作不正常,c#,multithreading,windows-forms-designer,C#,Multithreading,Windows Forms Designer,您好,我在windows窗体应用程序中制作了一个程序,以获取我所需的代码。我想在按下提交按钮时将其设置为不阻塞UI 我使用了这些代码。但是我得到了invalidoperationexception是未处理的异常 我试过了 void Generate() { textBox2.Text = ""; string[] sss = textBox1.Text.Split('\n'); textBox2.Text = "VERSION BUILD=8820413 RECORD
void Generate()
{
textBox2.Text = "";
string[] sss = textBox1.Text.Split('\n');
textBox2.Text = "VERSION BUILD=8820413 RECORDER=FX" + Environment.NewLine +
"SET !ERRORIGNORE YES" + Environment.NewLine +
"SET !TIMEOUT_TAG 3" + Environment.NewLine +
"SET !TIMEOUT_STEP 3" + Environment.NewLine +
"SET !TIMEOUT_PAGE 7" + Environment.NewLine +
"SET !REPLAYSPEED FAST" + Environment.NewLine;
string[] emails = textBox3.Text.Split('\n');
// label2.Text = emails.Length.ToString();
//foreach (string email in emails)
for (int i = 0; i < Convert.ToInt32(textBox5.Text); i++)
{
textBox2.Text += "TAB T=1" + Environment.NewLine + "CLEAR" + Environment.NewLine +
"URL GOTO=https://signin.ebay.com/ws/eBayISAPI.dll?SignIn&lgout=" + Environment.NewLine +
"WAIT SECONDS=1" + Environment.NewLine +
"TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:SIGNINFORM ATTR=ID:SUBMIT" + Environment.NewLine +
"SET !ENCRYPTION NO" + Environment.NewLine +
"TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:SIGNINFORM ATTR=ID:PASS CONTENT=Maths7524" + Environment.NewLine +
"TAG POS=1 TYPE=INPUT:TEXT FORM=ID:SIGNINFORM ATTR=ID:USERID CONTENT=" + emails[i] + Environment.NewLine +
"TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:SignInForm ATTR=ID:sgnBt" + Environment.NewLine + "WAIT SECONDS=7" + Environment.NewLine;
foreach (string item in sss)
{
textBox2.Text += "URL GOTO=www.ebay.com/itm/" + item + Environment.NewLine + "WAIT SECONDS=1" + Environment.NewLine + "TAG POS=1 TYPE=SPAN ATTR=ID:watchLabel" + Environment.NewLine + "TAG POS=1 TYPE=A ATTR=TXT:Watch" + Environment.NewLine + "WAIT SECONDS=1" + Environment.NewLine + Environment.NewLine;
}
}
}
只有UI线程可以更新UI。在另一个线程中运行耗时的I/O操作或长时间运行的计算是有意义的;但是,运行一个基本上只更新另一个线程中的文本框的方法是没有意义的。此方法必须在文本框上调用
Invoke
,使文本框操作再次在UI线程上运行
只需在click事件中正常运行此方法
您可以通过使用StringBuilder
并仅为文本框指定一次来加速该方法:
string[] sss = textBox1.Text.Split('\n');
string[] emails = textBox3.Text.Split('\n');
var sb = new StringBuilder();
sb.AppendLine("VERSION BUILD=8820413 RECORDER=FX");
sb.AppendLine("SET !ERRORIGNORE YES");
sb.AppendLine("SET !TIMEOUT_TAG 3");
sb.AppendLine("SET !TIMEOUT_STEP 3");
sb.AppendLine("SET !TIMEOUT_PAGE 7");
sb.AppendLine("SET !REPLAYSPEED FAST");
for (int i = 0; i < Convert.ToInt32(textBox5.Text); i++)
{
sb.AppendLine("TAB T=1").AppendLine("CLEAR");
sb.AppendLine("URL GOTO=https://signin.ebay.com/ws/eBayISAPI.dll?SignIn&lgout=");
sb.AppendLine("WAIT SECONDS=1");
sb.AppendLine("TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:SIGNINFORM ATTR=ID:SUBMIT");
sb.AppendLine("SET !ENCRYPTION NO");
sb.AppendLine("TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:SIGNINFORM ATTR=ID:PASS CONTENT=Maths7524");
sb.Append("TAG POS=1 TYPE=INPUT:TEXT FORM=ID:SIGNINFORM ATTR=ID:USERID CONTENT=").AppendLine(emails[i]);
sb.AppendLine("TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:SignInForm ATTR=ID:sgnBt");
sb.AppendLine("WAIT SECONDS=7");
foreach (string item in sss)
{
sb.Append("URL GOTO=www.ebay.com/itm/").AppendLine(item);
sb.AppendLine("WAIT SECONDS=1").AppendLine("TAG POS=1 TYPE=SPAN ATTR=ID:watchLabel");
sb.AppendLine("TAG POS=1 TYPE=A ATTR=TXT:Watch").AppendLine("WAIT SECONDS=1").AppendLine();
}
}
textBox2.Text = sb.ToString();
只有UI线程可以更新UI。在另一个线程中运行耗时的I/O操作或长时间运行的计算是有意义的;但是,运行一个基本上只更新另一个线程中的文本框的方法是没有意义的。此方法必须在文本框上调用
Invoke
,使文本框操作再次在UI线程上运行
只需在click事件中正常运行此方法
您可以通过使用StringBuilder
并仅为文本框指定一次来加速该方法:
string[] sss = textBox1.Text.Split('\n');
string[] emails = textBox3.Text.Split('\n');
var sb = new StringBuilder();
sb.AppendLine("VERSION BUILD=8820413 RECORDER=FX");
sb.AppendLine("SET !ERRORIGNORE YES");
sb.AppendLine("SET !TIMEOUT_TAG 3");
sb.AppendLine("SET !TIMEOUT_STEP 3");
sb.AppendLine("SET !TIMEOUT_PAGE 7");
sb.AppendLine("SET !REPLAYSPEED FAST");
for (int i = 0; i < Convert.ToInt32(textBox5.Text); i++)
{
sb.AppendLine("TAB T=1").AppendLine("CLEAR");
sb.AppendLine("URL GOTO=https://signin.ebay.com/ws/eBayISAPI.dll?SignIn&lgout=");
sb.AppendLine("WAIT SECONDS=1");
sb.AppendLine("TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:SIGNINFORM ATTR=ID:SUBMIT");
sb.AppendLine("SET !ENCRYPTION NO");
sb.AppendLine("TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:SIGNINFORM ATTR=ID:PASS CONTENT=Maths7524");
sb.Append("TAG POS=1 TYPE=INPUT:TEXT FORM=ID:SIGNINFORM ATTR=ID:USERID CONTENT=").AppendLine(emails[i]);
sb.AppendLine("TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:SignInForm ATTR=ID:sgnBt");
sb.AppendLine("WAIT SECONDS=7");
foreach (string item in sss)
{
sb.Append("URL GOTO=www.ebay.com/itm/").AppendLine(item);
sb.AppendLine("WAIT SECONDS=1").AppendLine("TAG POS=1 TYPE=SPAN ATTR=ID:watchLabel");
sb.AppendLine("TAG POS=1 TYPE=A ATTR=TXT:Watch").AppendLine("WAIT SECONDS=1").AppendLine();
}
}
textBox2.Text = sb.ToString();
可能的重复我认为它不是重复的,因为有一些改进,可能根本不需要使用线程。可能的重复我认为它不是重复的,因为有一些改进,可能根本不需要使用线程。我想显示“正在生成代码..请稍候..在标签6中”单击按钮并完成生成方法后,如果OP未使用stringbuilder,则label6应显示为“完成”,textBox5。文本可以包含
int.MaxValue
的任何内容,这可能符合长期运行计算的条件:)为什么我们不将其复制?这显然是由于缺少跨线程调用而导致的异常。我想在单击按钮并完成生成方法后显示“正在生成代码..请稍候..在标签6中”,label6应显示为“完成”,因为OP未使用stringbuilder,而textBox5.Text可以包含int.MaxValue
的任何内容,这可能是一个长期运行的计算:)为什么我们不把它复制一下呢?这显然是由于缺少跨线程调用而导致的异常。
private string Generate()
{
var sb = new StringBuilder();
//TODO: Create the text with a StringBuilder as shown above.
return sb.ToString();
}
private async Task<string> GenerateAsync()
{
return await Task.Run(() => Generate());
}
// Don't forgat the async keyword in button1_Click!
private async void button1_Click(object sender, EventArgs e)
{
label6.Text = "Generating Code.. Please wait....";
string text = await GenerateAsync();
textBox2.Text = text;
label6.Text = "Done.";
}