Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成代码在windows窗体中工作不正常_C#_Multithreading_Windows Forms Designer - Fatal编程技术网

C# 生成代码在windows窗体中工作不正常

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

您好,我在windows窗体应用程序中制作了一个程序,以获取我所需的代码。我想在按下提交按钮时将其设置为不阻塞UI

我使用了这些代码。但是我得到了invalidoperationexception是未处理的异常

我试过了

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.";
}