C# - 简单或复杂多线程函数的标准代理

时间:2013-03-12 16:27:35

标签: c# multithreading delegates signature

我是否可以使用C#中的标准委托进行调用。我是否必须为每个必须调用的新函数签名声明一个新委托?

现在我只有那些签名。但是,如果我可以使用本机代理来获得任何复杂的返回和参数,那将非常棒。

public bool isDone()
{...}
public void doStuff()
{...}
public void doMoreStuff(object o)
{...}
public void doEvenMoreStuff(string str)
{...}

// I'm declaring my "custom" delegates like this:
private delegate bool delegate_bool();
private delegate void delegate_void(string line);

// and calling via
if (InvokeRequired)
    Invoke(new delegate_void(doStuff), new object[] { });
else
    {...}

<小时/> 编辑:答案似乎是Action<>Func<>

if (InvokeRequired)
    return Invoke(new Func<bool>(isDone), new object[] { });
else
    {...}
if (InvokeRequired)
    BeginInvoke(new Action(doStuff), new object[] { });
else
    {...}
if (InvokeRequired)
    BeginInvoke(new Action<string>(doEvenMoreStuff), new object[] { "hello world" });
else
    {...}

6 个答案:

答案 0 :(得分:5)

您正在寻找Action<*>Func<*>代表,他们就是这样做的。

答案 1 :(得分:4)

Action<>Func<>代表是您应尽可能使用的“标准”代理。极少数情况下不能使用它们。

特别是如果您有可选参数,refout参数,超过16个参数或具有params参数,那么您将需要使用另一个(或您自己的自定义)代表。

答案 2 :(得分:2)

Action<>Func<>代表将为您提供所需内容

答案 3 :(得分:2)

Action<>Func<>可以执行这些类型的任务。

答案 4 :(得分:2)

是的,您可以使用Action和lambda。例如,Dispatcher.Invoke需要委托,但我们可以将lambda转换为Action,因此不需要为它定义新的委托:

Dispatcher.Invoke((Action)delegate() { ... });

答案 5 :(得分:1)

正如所有人所说的那样。 Action和Func会做你想做的事。应该对不返回值的方法使用Action,如果需要返回值,则可以使用Func。