0

C# でのスレッド化に関して、非常に厄介な問題が発生しています。このコードを使用すると、「フィールド初期化子は非静的フィールド、メソッド、またはプロパティ 'Scraper.Form1.scrapeStart()' を参照できません」というエラーが表示されます。

public partial class Form1 : Form
{
    public Thread scrape = new Thread(() => scrapeStart()); //This is where the error happens
    public About about = new About();
    public Form1()
    {
        InitializeComponent();
    }

    public void appendOutput(String s)
    {
        output.AppendText(s);
        output.SelectionStart = output.Text.Length;
        output.ScrollToCaret();
        output.Refresh();
    }

    public void scrapeStart(){
        Button button1 = new Button();
        appendOutput("");
        button1.Enabled = true;
    }

    private void button3_Click(object sender, EventArgs e)
    {
        about.ShowDialog();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        scrape.Start();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        scrape.Abort();
        button1.Enabled = true;
    }
}

関数scrapeStartを静的にすると機能することを認識していますが、それはappendOutput( "");を作成します。および button1.Enabled = true エラーをスローします。そして、新しいスレッドを開始した場所 (button1_Click) に配置すると、button2_Click で中止できません。

私はC#に少し精通しているので、すべてがひどく間違っているか、小さな問題である可能性があります。いずれにせよ、誰かが私を助けてくれませんか?

4

2 に答える 2

10

これはスレッド化とはまったく関係ありません。次のように記述しても、まったく同じ問題が発生します。

public class Foo
{
    int x = 10;
    int y = x;   
}

またはさらに明確に:

public class Bar
{
    object obj = this;
}

ここでは、this参照が暗黙的であるというわずかな気晴らしがあります。ターゲットが のデリゲートを作成していますthis

解決策は、割り当てをコンストラクターに入れることです。

public Thread scrape;
public About about = new About();
public Form1()
{
    InitializeComponent();
    scrape = new Thread(scrapeStart);
}

余談として:

  • public フィールドは使用しないでください。
  • .NET 命名規則に従ってください
  • またscrapeStart、UI 要素に直接アクセスしてはならないのスレッド部分を修正する必要があります。
于 2012-09-30T07:43:55.473 に答える
0

InvokeRequired を使用する必要があると思います。

public void scrapeStart()
{
    if (InvokeRequired)
    {
    this.Invoke(new Action(scrapeStart));
    return;
    }
    Button button1 = new Button();
    appendOutput("");
    button1.Enabled = true;
}
于 2012-09-30T07:48:58.093 に答える