gpt4 book ai didi

c# - 如何使用 .NET Action 执行参数数量未知的方法?

转载 作者:IT王子 更新时间:2023-10-29 04:29:05 24 4
gpt4 key购买 nike

我想在向用户显示进度条的同时在工作线程上执行一些操作。我创建了一个类

public class ProgressBar
{
public void StartAsyncTask(Action action)
{
Task t = new Task(action);
t.start();
}
}

我发现我可以通过以下方式将任何方法发送到 StartAsyncTask:

  ProgressBar pb = new ProgressBar();
pb.StartAsyncTask( () => DoSomething(15, "something"));

public void DoSomething(int i, string s)
{
//do something
}

首先,我似乎无法理解 lambda 表达式是什么以及如何翻译 - () => - 以及 Action 对象如何传递给具有未知数量参数的委托(delegate)。

我想将 BackgroundWorker 与我的 ProgressBar 一起使用,但在这种情况下,我需要调用该操作。所以像这样:

void m_backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
Action action = e.Argument as Action; //same action here passed through EventArgs
//but already in a worker thread so no need for the Task object

//and now i need to somehow invoke the action object but i don't know what the parameters are.

action.Invoke( ? );
}

在第一个示例中,如何在不知道 StartAsyncTask(Action action) 方法中的参数的情况下执行操作?

为什么在这种情况下调用 Action 时需要知道参数?

关于如何/为什么/何时使用“Action”的所有内容对我来说都非常不清楚,即使我在这里阅读了 MSDN 文档和其他一些主题。有关这方面的任何信息都会对我有所帮助。

最佳答案

我觉得你有点想多了。那么让我们从头开始:

  1. lambda 表达式是一种引用方法执行的符号。示例:

     x => x + 3

    在最基本的层面上,这表示一个函数接受 1 个输入 x,然后返回一个等于 x + 3 的值。所以在你的情况下,你的表情:

    () => DoSomething(15, "Something")

    表示一个方法接受0个参数,然后调用方法DoSomething(15, "Something")。编译器在幕后为您将其转换为 FuncAction 委托(delegate)。所以它是有效的:

    new Action(delegate()
    {
    DoSomething(15, "Something")
    });

    我上面的简单表达式的编译器重写是:

    new Func<int, int>(delegate(int x)
    {
    return x + 3;
    });
  2. 接下来,如果您想稍后调用一个 Action ,这样做的语法非常简单:

    Action someMethod = new Action(() => { Console.WriteLine("hello world"); }));
    someMethod(); // Invokes the delegate

    因此,如果您有一个给定的 Action 实例,只需使用 () 语法调用它即可,因为 Action 是一个接受 0 个参数且不返回任何内容的委托(delegate)。

    函数同样简单:

    Func<int, int> previousGuy = x => x + 3;
    var result = previousGuy(3); // result is 6
  3. 最后,如果您想传递要调用的方法,而此时您没有参数的上下文,您只需将调用包装在一个操作中,稍后再调用它。例如:

    var myAction = new Action(() =>
    {
    // Some Complex Logic
    DoSomething(15, "Something");
    // More Complex Logic, etc
    });

    InvokeLater(myAction);

    public void InvokeLater(Action action)
    {
    action();
    }

    所有数据都在您的方法的闭包中捕获,因此被保存。因此,如果您可以使用 e.Argument 属性设法将 Action 传递给您的事件,那么您需要做的就是调用 (e.作为 Action 的参数)()

关于c# - 如何使用 .NET Action 执行参数数量未知的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13260322/

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