2

私のプログラムには継続的に呼び出されるメソッドがあるので、GUIがビジネスを行っている間、GUIがフリーズしないようにスレッド化したいと思います。

Thread t = new Thread(Class2.ArrayWorkings(1, MyGlobals.variable1));
    t.start();
        int[] localVariable1 = ??// I want to move the value returned from the method into localVariable1.  

現在、私のエラーは次のとおりです。

'System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)'に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります

引数1:「メソッドグループ」から「System.Threading.ParameterizedThreadStart」に変換できません

現在、次のようにスレッド化せずにこれを実行しています。

   int[] localVariabl1 = Class2.ArrayWorkings(1, MyGlobals.variable1);
4

4 に答える 4

9

ラムダを使用してコンストラクターを修正できます。

Thread t = new Thread(() => Class2.ArrayWorkings(1, MyGlobals.variable1));

しかし、それでは(Jonが指摘しているように)すぐに結果を得ることができません。そうしないと、同期コードを再度記述していることになります。代わりに、ある種のコールバックを探すことができます; おそらく、UIスレッドに戻る必要があるので、次のようにします。

Thread t = new Thread(() => {
    // this runs on the worker
    int[] localVariabl1 = Class2.ArrayWorkings(1, MyGlobals.variable1);
    this.Invoke((MethodInvoker)delegate {
        // now we're back on the UI thread!
        update the UI from localVariabl1
    });
});
t.Start()

ただし、おそらくスレッドプールを使用することをお勧めします。

ThreadPool.QueueUserWorkItem(delegate {
    // this runs on the worker
    int[] localVariabl1 = Class2.ArrayWorkings(1, MyGlobals.variable1);
    this.Invoke((MethodInvoker)delegate {
        // now we're back on the UI thread!
        update the UI from localVariabl1
    });
});
于 2012-06-27T06:30:13.893 に答える
2

それを行う1つの方法は次のとおりです。

ThreadStart starter = delegate { Class2.ArrayWorkings(1, MyGlobals.variable1); };
var thread = new Thread(starter);
thread.Start();

編集:スレッドからの戻り値も取得したいことがわかりました。マークの回答に記載されているように、ThreadPool.QueueUserWorkItemを使用する必要がある場合があります

あなたが見たいと思うかもしれないものは.NETFramework4.5(まだリリース候補にあります)非同期プログラミングで生活を楽にします。

.NET4.5のawait演算子

于 2012-06-27T06:30:06.043 に答える
2

ThreadStartデリゲートを配置する必要があります。UIに影響を与えたくない場合は、BackgroundWorkerクラスを使用する必要があります。

于 2012-06-27T06:30:44.817 に答える
1

タスクは、最終的に値を返す非同期ジョブを実行するための簡単なインターフェイスを提供します。Task<string>たとえば、aが整数の配列を返す文字列を(最終的に)返すタスクですTask<int[]>

int[] localVariable1;

// start the task
Task<int[]> myTask = Task.Factory.StartNew<int[]>(() => Class2.ArrayWorkings(1, MyGlobals.Variable1);

// when it is finished get the result and place in local variable
myTask.OnCompleted(task => localVariable1 = task.Result;);

非同期操作が終了した後でUIコンポーネントを更新する場合は、Invoke(winformsの場合)を使用する必要があります。これにより、UIスレッド上に存在するオブジェクト(ボタンやラベルなど)を操作できます。

myTask.OnCompleted(task => localVariable1.Invoke(new Action(() =>
    localVariable1.Value = task.Result; )));
于 2012-06-27T06:36:10.503 に答える