2017-04-01 1 views
-4

라이브러리를 관리하는 앱을 만들고 있습니다. 현재 나는 책 연구를위한 코드를 만들고 있는데, 이제 막 문제를 발견하게되었습니다. 저는이 연구를 처리하는 Thread와 나머지 실행을 처리하는 Thread를 만들었습니다. 나는 자기 자신에게 묻습니다. 스레드가 여러 방법을 관리 할 수 ​​있습니까? 그렇다면 어떻게 할 수 있습니까? 하나의 메소드를 스레드 선언에 넣을 수 있기 때문입니다. 예를 들어 사용자가 검색 버튼을 누르면 (menubox에서) 나는 (내 researchThread를 통해) goToUrl() 메소드를 실행하는 URL로 이동하는 앱만 원한다. 그런 다음 사용자가 검색 버튼을 누르면 (책의 keyWord를 작성한 후) 동일한 스레드가 다른 메소드 (search() 메소드)를 실행하게합니다. 모든 기능에 대해 수천 개의 스레드를 만들고 싶지 않으므로 (그리고 이것이 올바른 해결책이 아니라고 생각합니다.)이 상황을 어떻게 관리 할 수 ​​있습니까? 미리 감사드립니다.여러 메서드가있는 C# 스레드

+4

[async/await] (https://msdn.microsoft.com/en-us/library/mt674882.aspx) 기능에 대해 배우고 스레드 관리에 대해 걱정하지 마십시오. 아주 특별한 상황에서만 쓰레드를 수동으로 처리해야하고, 쓰는 것에서는 그렇지 않습니다. –

답변

2

스레드 대신 Task 클래스를 사용하십시오. 불필요하게 쓰레드를 사용하지 못하게하십시오. Tasks로 작업하면 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 반환 작업 및 매개 변수 클래스 –

관련 문제