C# 委托是否可以携带参数?

C# 委托是否可以携带参数?,c#,parameters,delegates,C#,Parameters,Delegates,假设我有一个函数 public void SendMessage(Message message) { // perform send message action } 我可以为这种函数创建一个委托吗?如果是,当我使用代理时如何传递消息 在我的例子中,函数由线程使用。每当发生事件时,我都需要向服务器发送消息,以保留记录。我还需要让它在后台运行,这样它就不会影响应用程序。但是,线程需要使用委托 Thread t = new Thread(new ThreadStart(SendMessag

假设我有一个函数

public void SendMessage(Message message)
{
   // perform send message action
}
我可以为这种函数创建一个委托吗?如果是,当我使用代理时如何传递消息

在我的例子中,函数由线程使用。每当发生事件时,我都需要向服务器发送消息,以保留记录。我还需要让它在后台运行,这样它就不会影响应用程序。但是,线程需要使用委托

Thread t = new Thread(new ThreadStart(SendMessage));
我不知道如何将信息传递给学员。谢谢。

当然可以

public delegate void DelWithSingleParameter(Message m);
传递消息可以通过以下方法完成

DelWithSingleParameter d1 = new DelWithSingleParameter(this.SomeMethod);
d1(new Message());
正如@Mehrdad在新版本的框架中指出的,您不再需要定义这样的委托。而是将现有的
操作
委托重新用于此类操作

Action<Message> d1 = new Action<Message>(this.SomeMethod);
d1(new Message());
Action d1=新操作(this.SomeMethod);
d1(新信息());

当然,只需这样定义委托:

 delegate void SendMessageDelegate(Message message);
然后像平常一样调用它:

 public void InvokeDelegate(SendMessageDelegate del) 
 {
      del(new Message());
 }

当然,请参阅以获取示例。

您需要使用参数化的ThreadStart。请看这里:


你也可以这样做

object whatYouNeedToPass = new object();

Thread t = new Thread( () => 
{
    // whatYouNeedToPass is still here, you can do what ever you want :)
});

t.Start();

或者干脆
操作
;)1+. 在新版本的语言中,您也可以省略“新操作”,这一点您肯定知道;)@Skurmedel或我可以换一种方式,使用
var
而不是显式变量类型;)有趣的是,
Action
(带有一个单一类型的param)从.NET 2.0开始就一直存在,并在
mscorlib.dll
中声明,但其他变体(包括非泛型变体)是LINQ的副作用,出现在3.5中;它们在
System.Core.dll
@Mehrdad中声明,这在.Net 4.0中有所改变。现在,它们都驻留在mscorlib中,并且是从System.Core.dll转发的类型。除了仍在System.Core中的Silverlight之外,它们也可以有一个返回值。用于谓词和排序函数。这是线程基础结构使用的专用委托。在这种情况下使用它没有多大意义。他最好创建自己的代理,或者像Mehrdad上面说的那样,使用
操作
。再看看他的问题。他特别指出,这个问题是指将参数传递给要在后台运行的线程:-PAh是的,您是正确的。对不起,现在收回我的反对票已经太晚了。你的答案是这里最好的。很酷:)我记不起有多少次我误读了一个问题。