2

window_load で関数 populate() を呼び出すアプリケーションに取り組んでいます

この関数の実行には約 1 分かかります。この関数を別のスレッドで呼び出すようにしたい。

次のコードを使用しています

Thread thread = new Thread(PopulateAndDrawGraph);
        thread.Start();

この関数の最後の行は

nodeXlControl1.DrawGraph(真);

ここで例外が発生します

別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。

実際にどのような問題が発生するか

4

7 に答える 7

2

コントロールを作成したのと同じスレッド (通常は UI スレッド自体) 内からのみ UI コントロールにアクセスできます。

スレッド対応になるようにコードを変更する必要があります。

これは、MSDN マガジンに掲載された素晴らしい記事です: Give Your .NET-based Application a Fast and Responsive UI with Multiple Threadsでは、やりたいことを実行する方法を詳細に説明しています。

この記事は少し古いですが、同じ原則が適用されます。

async新しい/キーワードなどの新しい C# 言語機能awaitにより、タスクが少し簡単になるはずです。

ただし、UI コントロールにアクセスするための同じ古い制限がまだ存在することに注意してください。記事で説明されている基本を理解する方法はありません。

于 2012-12-28T12:06:34.310 に答える
1

これを処理するには、正しい方法と別の方法の 2 つの方法があります。

1: うまく機能するソリューションが必要な場合は、これでうまくいくはずです..

    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the 
        // calling thread to the thread ID of the creating thread. 
        // If these threads are different, it returns true. 
        if (this.textBox1.InvokeRequired)
        {   
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text = text;
        }
    }

msdn.microsoft.com/en-us/library/ms171728.aspx

2: ただし、適切に動作するという保証のない迅速な解決策が必要な場合は、次の変数を設定してください: Control.CheckForIllegalCrossThreadCalls = False

于 2012-12-28T12:57:35.523 に答える
0

このコントロールを作成したスレッド以外のスレッドから UI コントロールにアクセスすることはできません (メイン UI スレッドからのみ UI コントロール プロパティにアクセス/変更できます)。このリンクにアクセスしてください。クロススレッド操作が無効であることを明確にしていただければ幸いです

于 2012-12-28T14:59:07.120 に答える
0

問題は、UI インタラクションがアプリケーションのメイン スレッドで発生する必要があることです。私のアドバイスは、別のスレッドで計算を行い、結果をオブジェクトに収集することです。スレッドが終了したら、そのオブジェクトから結果を抽出し、それを nodeXlControl1 に配置できます。

悲しいことに、あなたの目的についての詳細はわかりません。解決策の合計はこれです。これについて詳しく教えていただければ、さらにお役に立てるかもしれません。

于 2012-12-28T12:05:34.550 に答える
0

こちらの記事 (方法: スレッドセーフな呼び出しを行う) を確認してください。クロススレッド呼び出しに関するすべての関連項目について説明します。また、C# の「タスク」の概念についても調べてみることをお勧めします。並列処理や同様の概念を処理するのに役立つ、非常によく書かれた lib があります。

于 2012-12-28T12:07:36.917 に答える
0

スレッドから UI 要素にアクセスしようとしているので、 を呼び出す必要がありますInvoke。したがって、次のPopulateAndDrawGraphものが必要です。

Invoke((Action)(() =>
{
    nodeXlControl1.DrawGraph(true);
}));
于 2012-12-28T12:09:09.113 に答える