我想通過一個函數,它的一個參數的ThreadStart構造函數,C#。但是,看來這是不可能的,因爲我得到一個語法錯誤是我嘗試做這樣的事情傳遞參數給線程
Thread t1 = new Thread(new ThreadStart(func1(obj1));
其中OBJ1是List<string>
類型的對象(說)。
如果我想要一個線程來執行此功能,在一個對象作爲參數,我打算同時創建2級這樣的線程具有不同的參數值是什麼,是實現這一目標的最佳方法是什麼?
我想通過一個函數,它的一個參數的ThreadStart構造函數,C#。但是,看來這是不可能的,因爲我得到一個語法錯誤是我嘗試做這樣的事情傳遞參數給線程
Thread t1 = new Thread(new ThreadStart(func1(obj1));
其中OBJ1是List<string>
類型的對象(說)。
如果我想要一個線程來執行此功能,在一個對象作爲參數,我打算同時創建2級這樣的線程具有不同的參數值是什麼,是實現這一目標的最佳方法是什麼?
你需要ParametrizedThreadStart
一個參數傳遞給線程。
Thread t1 = new Thread(new ParametrizedThreadStart(func1);
t1.Start(obj1);
如果您使用.NET 3.5或更高版本,一個選擇是使用這個拉姆達:
var myThread = new System.Threading.Thread(() => func1(obj1));
非常感謝! – assassin 2010-05-12 05:07:38
試試這個:
var bar = 0.0;
Thread t = new Thread(() =>
{
Foo(bar);
});
t.IsBackground = true;
t.Start();
或者你的情況:
Object obj1 = new Object();
Thread t = new Thread(() =>
{
func1(obj1);
});
t.IsBackground = true;
t.Start();
你可以像這樣開始一個新的線程:
Thread thread = new Thread(delegate() {
// Code here.
});
thread.Start();
裏面的anonymous method您有權訪問是在範圍上創建委託時的變量。
編輯刺客有麻煩此代碼工作,所以我已經包括在這篇文章的最後一個完整的示例控制檯應用程序。
{ // some code
Thread t1 = new Thread(MyThreadStart);
t1.Start(theList);
}
void MyThreadStart(object state)
{
List<string> theList = (List<string>)state;
//..
}
這是我的編輯:下面是一個完整的控制檯應用程序 - 該技術確實工作:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
System.Threading.Thread t = new System.Threading.Thread(MyThreadStart);
t.Start("Hello");
System.Console.ReadLine();
}
static void MyThreadStart(object state)
{
System.Console.WriteLine((string)state);
}
}
}
這是你要找的影響嗎?
static void Main(string[] args)
{
var list = new List<string>(){
"a","b","c"
};
Thread t1 = new Thread(new ParameterizedThreadStart(DoWork));
t1.Start(list);
Console.ReadLine();
}
public static void DoWork(object stuff)
{
foreach (var item in stuff as List<string>)
{
Console.WriteLine(item);
}
}
static void func1(object parameter)
{
// Do stuff here.
}
static void Main(string[] args)
{
List<string> obj1 = new List<string>();
Thread t1 = new Thread(func1);
t1.Start(obj1);
}
它使用.NET 2.0中新的代表呼籲ParameterizedThreadStart。你可以閱讀關於它here。
你絕對需要使用Thread
對象?或者你只是在尋找多線程處理髮生?更「現代」的方法是使用異步委託作爲這樣:
private delegate void FuncDelegate(object obj1);
.
.
.
FuncDelegate func = func1;
IAsyncResult result = func.BeginInvoke(obj1, Completed, func);
// do other stuff
.
.
.
private void Completed(IAsyncResult result)
{
((FuncDelegate)result.AsyncState).EndInvoke(result);
// do other cleanup
}
甚至更「現代」的方法是在.NET 4 TPL使用Tasks。
您正在使用什麼版本的.NET的? – 2010-05-11 16:57:34
哇!我之前通過創建一個包含該線程將使用的數據的類來實現此目的,但我不知道有這麼多種不同的方法來對此動物進行蒙皮! – 2010-05-11 17:01:45