Dan*_*inu 22 c# lambda multithreading action
我想在工作线程上执行一些操作,同时向用户显示进度条.我创造了一个班级
public class ProgressBar
{
public void StartAsyncTask(Action action)
{
Task t = new Task(action);
t.start();
}
}
Run Code Online (Sandbox Code Playgroud)
我发现我可以StartAsyncTask通过以下方式发送任何方法:
ProgressBar pb = new ProgressBar();
pb.StartAsyncTask( () => DoSomething(15, "something"));
public void DoSomething(int i, string s)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
首先,我似乎无法理解lambda表达式是什么以及如何() =>- 已翻译以及Action对象如何传递具有未知数量参数的委托.
我想BackgroundWorker在我的ProgressBar中使用a ,但在这种情况下我需要调用该动作.所以像这样:
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( ? );
}
Run Code Online (Sandbox Code Playgroud)
在第一个例子中如何在不知道StartAsyncTask(Action action)方法中的参数的情况下执行操作?
在这种情况下,为什么在调用操作时需要知道参数?
Action即使我在这里阅读MSDN文档和其他一些线程,关于如何/为何/何时使用" "的所有内容对我来说都很不清楚.任何有关此信息都将对我有所帮助.
Tej*_*ejs 51
我觉得你有点过分思考.所以让我们从顶部开始:
lambda表达式是引用方法执行的表示法.例:
x => x + 3
Run Code Online (Sandbox Code Playgroud)
在最基本的级别,这表示一个函数,它接受1个输入,x然后返回一个等于的值x + 3.所以在你的情况下,你的表达:
() => DoSomething(15, "Something")
Run Code Online (Sandbox Code Playgroud)
表示采用0参数的方法,然后调用该方法DoSomething(15, "Something").编译器在幕后将其转换为Func或Action委托给您.所以它实际上是:
new Action(delegate()
{
DoSomething(15, "Something")
});
Run Code Online (Sandbox Code Playgroud)
编译器重写上面的简单表达式将是:
new Func<int, int>(delegate(int x)
{
return x + 3;
});
Run Code Online (Sandbox Code Playgroud)接下来,如果您想稍后调用某个操作,那么这样做的语法非常简单:
Action someMethod = new Action(() => { Console.WriteLine("hello world"); }));
someMethod(); // Invokes the delegate
Run Code Online (Sandbox Code Playgroud)
因此,如果您有一个给定的Action实例,只需使用()语法调用它就是您所需要的,因为它Action是一个接受0参数并且不返回任何内容的委托.
功能同样容易:
Func<int, int> previousGuy = x => x + 3;
var result = previousGuy(3); // result is 6
Run Code Online (Sandbox Code Playgroud)最后,如果要传递一个方法来调用,并且此时没有参数的上下文,您可以简单地将您的调用包装在一个操作中,然后再调用它.例如:
var myAction = new Action(() =>
{
// Some Complex Logic
DoSomething(15, "Something");
// More Complex Logic, etc
});
InvokeLater(myAction);
public void InvokeLater(Action action)
{
action();
}
Run Code Online (Sandbox Code Playgroud)
所有数据都在方法的闭包中捕获,因此被保存.因此,如果您可以设法Action将e.Argument财产传递给您的活动,那么您需要做的就是打电话(e.Argument as Action)().
| 归档时间: |
|
| 查看次数: |
55605 次 |
| 最近记录: |