gpt4 book ai didi

c# - 委托(delegate)所有方法

转载 作者:行者123 更新时间:2023-11-30 20:43:16 25 4
gpt4 key购买 nike

我想实现一个TaskQueue。我将任务添加到队列中,当我调用 Run() 时,任务将由线程执行。

class Executer
{
private Queue<Task> TaskQueue;

private Thread thread;

public Executer()
{
this.TaskQueue = new Queue<QueueNode>();
}

public void AddTask(Task task)
{
this.TaskQueue.Enqueue(task);
}

public void Run()
{
this.thread = new Thread(() => ThreadMethod);

this.thread.Start();
}
}

ThreadMethod 循环遍历 Queue 并执行 Task

但我的问题是我找不到Task 的数据类型,因为Task 可能是一切。

假设我只想调用带有 int 参数的方法。然后就很容易了.. Task 可能是这样的:

Action<int> Task = object.AddToTheObjectCounter(5);

但这只是无数个案例中的一个。

你能给我一个小费吗?

我也想过通过

动态调用方法
object.GetType().GetMethod("AddToTheObjectCounter") // ...

但我认为这不好,因为当我有拼写错误时,代码编译但会崩溃。


提示:我发现您可以使用可变数量的参数调用委托(delegate)(查看下面的答案):

private void TestMethod()
{
Delegate function = (Func<int, int, int>)((a, b) => a * b);
object[] parameters = new object[] {7, 2};
var result = (int)function.DynamicInvoke(parameters);
}

最佳答案

嗯,有 Delegate .

private Queue<Delegate> TaskQueue;
...

public void AddTask(Delegate task)
{
this.TaskQueue.Enqueue(task);
}

但是,当使用 AddTask 添加任务时,不会像以前那么容易了。您首先需要转换为已知委托(delegate) ( Func<> ),然后传递一个参数。

obj.AddTask((Func<...>)nameOfTheMethod);
// obj.AddTask((Func<string[], void>)Console.WriteLine);

当您调用 Delegate例如,你不能使用 operator()因为你不确定这个函数到底是什么。你必须使用 DynamicInvoke 相反。

关于c# - 委托(delegate)所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com