动态执行方法

np.*_*np. 1 c#

很多时候我使用这样的代码:

public static void ExecuteMethod1InThread(string msg)
{
    Thread t = new Thread(
        new ThreadStart(
            delegate
            {
                log(msg);
            }));
    t.IsBackground = true;
    t.Start();
    t.Join();
}
Run Code Online (Sandbox Code Playgroud)

如果你注意到我在一个单独的线程中调用一个方法,希望它对性能有帮助.

但我想知道是否有可能动态地给出方法名称和参数并让它执行它而不是为每个方法调用创建如上所述的代码块.

我知道我们可以使用反射,但它会影响性能是我的理解.

我也听说过匿名代表,但我不确定他们是如何工作的.只是想知道是否有人可以启发.

Jon*_*eet 7

(请阅读底部的关键点!)

好吧,你已经在使用匿名方法了.您可以继续使用C#2.0并使代码更短,如下所示:

public static void ExecuteMethod1InThread(string msg)
{
    Thread t = new Thread(delegate() { log(msg); });
    t.IsBackground = true;
    t.Start();
    t.Join();
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用C#3中的lambda表达式:

public static void ExecuteMethod1InThread(string msg)
{
    Thread t = new Thread(() => log(msg));
    t.IsBackground = true;
    t.Start();
    t.Join();
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以更简单地调用不同的方法,如下所示:

public static void ExecuteMethodInThread<T>(Action<T> method, T argument)
{
    Thread t = new Thread(() => method(argument));
    t.IsBackground = true;
    t.Start();
    t.Join();
}
Run Code Online (Sandbox Code Playgroud)

然后你用这个叫:

ExecuteMethodInThread(Log, "message");
ExecuteMethodInThread(DifferentMethod, 10);
Run Code Online (Sandbox Code Playgroud)

(例如).

或者,您可以将其更改为仅以ThreadStart开头:

public static void ExecuteMethodInThread(ThreadStart action)
{
    Thread t = new Thread(action);
    t.IsBackground = true;
    t.Start();
    t.Join();
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

ExecuteMethodInThread(() => Log("Message"));
ExecuteMethodInThread(() => DoSomethingElse(20));
Run Code Online (Sandbox Code Playgroud)

然而,由于评估了各种表达式,这并不完全等效.特别是,在循环中执行此操作可能会导致Eric Lippert在此描述的问题.

很重要的一点

但是,你现在得到的东西会损害性能.你正在开始一个新线程(而不是使用线程池)然后你正在等待线程完成.这有效地log同步调用方法 - 这有助于提高性能?