2017-04-01 13 views
-4

私はライブラリを管理するアプリケーションを作っています。現在、私は書籍の研究のためのコードを作っており、私は問題を見つけました。私は、残りの実行を処理するものに加えて、この研究を扱うスレッドを作成しました。私は自分自身に尋ねていました。スレッドが複数の方法を管理する可能性はありますか?そうであれば、スレッドの宣言に1つのメソッドしか入れることができないので、どのようにすればいいのですか。たとえば、ユーザーが検索ボタンを押したとき(menubox内)、私はアプリケーションを(私のresearchThreadを通して)URLに行き、goToUrl()メソッドを実行したいだけです。次に、ユーザーが検索ボタンを押すと(ブックのkeyWordを書き込んだ後)、別のメソッド(search()メソッド)を同じスレッドで実行します。すべての機能に対して数千のスレッドを作成したくないので(これが正しい解決策ではないと思うので)、どうすればこの状況を管理できますか?前もって感謝します。複数のメソッドを持つC#スレッド

+4

[async/await](https://msdn.microsoft.com/en-us/library/mt674882.aspx)の機能だけを学び、スレッド管理について心配する必要はありません。非常に特殊な状況でのみスレッドを手動で処理しなければなりません。あなたが書いたものから、これは当てはまりません。 –

答えて

2

スレッドの代わりにTaskクラスを使用してください。不必要にスレッドを使用しないようにする。タスクを操作すると、コードAsynchronousが実行されます。また、キーワードAsync and Awaitを使用することもできます。

public void Start() 
    { 
     //Create Task with parameter 
     Task search = new Task(() => new Action<int>(SomeSearchMethod)(4)); 

     // Create Normal Task 
     Task download = new Task(SomeDownloadMethod); 

     // Create Task with Return value    
     Task<string> proccessString = Task.FromResult(SomeProcessing()); 
     MessageBox.Show(proccessString.Result); 

     // Start Task 
     search.Start(); 
     download.Start(); 

     // Wait untill task finisht 
     search.Wait(); 
     download.Wait(); 
     /* or for both tasks*/ 
     Task.WaitAll(); 
    } 

    private void SomeDownloadMethod() 
    { 
     //logic 
    } 

    private void SomeSearchMethod(int value) 
    { 
     MessageBox.Show("Parameter Search" + value.ToString()); 
    } 

    private string SomeProcessing() 
    { 
     return "Proccess"; 
    } 
+0

ありがとうございます。しかし、メソッドにパラメータがある場合はどうしますか?私は特定のコードを使用しようとしましたが、別のスレッドで使用されているため、メソッドにアクセスできないという例外があります。 –

+0

@AndreaFerrandoこれは最初の質問とは別の問題です。UIコントロールにアクセスする場合は、作成したスレッドでこれを行う必要があります。これはUIスレッドです。その話題についての情報はたくさんあります。 – khargoosh

+0

@Andrea Ferrando復帰タスクとパラメータクラスの回答を更新しました –

関連する問題