线程在c#中

Jan*_*jay 5 c# multithreading

如何使用C#中的线程调用一个带两个参数的函数?我必须从另一个函数调用StartDNIThread(string storeID,string queryObject).我必须传递两个值.它们都是字符串

Jon*_*eet 8

你的选择是:

  • 将参数封装在新类中,并将该方法用于委托到该类中.
  • 使用匿名函数(匿名方法或lambda表达式)自动对捕获的变量执行相同的操作.

后者通常更容易.你还没有展示你在线程中做了什么,但你可能会做以下事情:

string storeID = "...";
string queryObject = "...";

Thread t = new Thread(() => StartDNIThread(storeID, queryObject));
t.Start();
Run Code Online (Sandbox Code Playgroud)

请注意,因为捕获了变量,所以在知道线程实际启动之后才能更改这些值.您可以使用匿名函数仅使用的捕获变量来解决此问题:

string storeID = "...";
string queryObject = "...";

string storeIDCopy = storeID;
string queryObjectCopy = queryObject;
Thread t = new Thread(() => StartDNIThread(storeIDCopy, queryObjectCopy));
t.Start();
// You can now change storeID and queryObject freely
Run Code Online (Sandbox Code Playgroud)

如果你在循环中做任何事情,这一点尤为重要,因为循环变量本身会发生变化.例如:

foreach (string storeID in stores)
{
    string storeIDCopy = storeID;
    Thread t = new Thread(() => StartDNIThread(storeIDCopy, queryObject));
    t.Start();
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用线程池或任何其他方式启动线程,则模式基本相同.


Cha*_*lie 6

ThreadStart threadStart = delegate{StartDNIThread(string storeID, string queryObject);};
Thread thread = new Thread(threadStart);
thread.Start();
Run Code Online (Sandbox Code Playgroud)

或者使用lambdas:

ThreadStart threadStart = () => StartDNIThread(string storeID, string queryObject);
Thread thread = new Thread(threadStart);
thread.Start();
Run Code Online (Sandbox Code Playgroud)