簡體   English   中英

C#中的多線程:如何將函數名稱傳遞給另一個函數來啟動新線程?

[英]Multithreading in C#: How can I pass a function name to another function to start a new thread?

我在我的C#代碼中使用多線程如下:

Thread startThread;

public void NewThread()
{
   ThreadStart starter = delegate { foo(); };
   startThread = new Thread(starter);
   startThread.Start();
}

private void foo()
{
   //do some work
}

然后在我的應用程序中,我調用NewThread()來運行新線程。

但是現在我在每個類上都有很多線程,並且每個類都有一個NewThread(),我想把它移動到一個靜態的Util類,並在每次我希望在該函數上有一個新線程時將它傳遞給它。

你知道這是怎樣做的最佳方法,如果是的話我怎樣才能將函數名稱作為參數傳遞給它?

好吧,由於該方法是私有的,調用者知道方法名稱是否有意義? 如果它是公開的,您可以傳遞方法:

public void NewThread(Action task)
{
   ThreadStart starter = delegate { task(); };
   startThread = new Thread(starter);
   startThread.Name = task.Method.Name;
   startSpoolerThread.Start();
}

public void foo()
{
   //do some work
}

NewThread(obj.foo);

但是,對於私有方法,我懷疑枚舉/開關是最好的選擇......

NewThread(TasktType.Foo);

或者,你可以通過反思獲得方法......

public void NewThread(string name)
{
    MethodInfo method = GetType().GetMethod(name,
        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
        null, Type.EmptyTypes, null);
    ThreadStart starter = delegate { method.Invoke(this, null); };
    // etc (note: no point using Delegate.CreateDelegate for a 1-call usage

除非有明確創建線程的特定原因,否則為什么不使用Threadpool? Threadpool.QueueUserWorkItem方法將委托作為要執行的工作單元。 委托是一種特定類型,但您可以像在示例中一樣將自己的委托調用包裝在其中。 除非您需要精細控制或取消,否則通常最好使用線程池而不是自己旋轉線程。

我建議您考慮查看並行擴展任務API的CTP; 你沒有提到為什么你需要一個主題,但他們已經自動化了大部分內容,這是他們博客的鏈接

看看下面有關Codeproject“ 窮人的Parallel.ForEach Iterator ”的文章。 我認為這正是你在尋找的東西。 非常好用。

對於更強大的東西,還可以看一下Power Threading Library

或者,如果您正在使用Win.Forms或類似的基於GUI的應用程序,我建議使用BackgroundWorker 它負責為大多數與線程相關的事件進行編組,並且中止(如果這是你需要做的事情)也不那么復雜。

代理已經提供了一種異步執行它們的方法。 例如:

delegate void dowork();
private static void WorkDone(IAsyncResult result)
{
   ((dowork)result.AsyncState).EndInvoke(result);
    // this function is called when the delegate completes
}
public void Start()
{
    dowork dw = delegate {// code in this block has it's own thread };
    dw.BeginInvoke(WorkDone, null);
}

所以為了將函數指針傳遞給其他任何東西,你只需要創建一個具有正確簽名的委托(在這種情況下我使用了匿名方法,但你可以使用任何具有正確簽名的函數)並調用它的BeginInvoke方法,傳遞一個函數將在完成后被調用..該函數必須在原始委托上調用EndInvoke,並將其傳遞給result參數中的WorkDone函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM