2017-04-01 30 views
-4

我正在制作一个管理库的应用程序。目前,我正在编写这些书籍的研究代码,并且我刚刚遇到了一个问题。除了处理其余执行的内容外,我还创建了一个处理此研究的线程。我在问自己,有没有可能一个线程管理多种方法?如果是这样,你怎么能这样做,因为你只能在线程的声明中放置一个方法。例如,当用户按下搜索按钮(在menubox中)时,我只想让应用程序(通过我的researchThread)转到url,运行goToUrl()方法。然后,当用户按下搜索按钮(在书写本书的关键词之后),我想让同一个线程运行另一种方法(search()方法)。由于我不想为每个功能创建一千个线程(因为我认为这不是正确的解决方案),我该如何处理这种情况?提前致谢。多种方法的C#线程

+4

只要了解[异步/等待](https://msdn.microsoft.com/en-us/library/mt674882.aspx)功能,并且不必担心线程管理。你只能在非常特殊的情况下手动处理线程,并且从你写的东西我猜这不是这种情况。 –

回答

2

使用Task类代替线程。不必要地使用线程。使用任务将运行您的代码异步。您也可以使用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线程。关于该主题的大量关于SO的信息只是搜索。 – khargoosh

+0

@Andrea Ferrando我更新了答案,并返回了任务和参数类 –