我有一个名为LoadData的方法,它从DataBase获取数据并填充DataGridView
。
我正在使用秒表来测量我的方法完成它的工作所需的时间,如下所示:
private void btnLoadData_Click(object sender, EventArgs e)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
LoadData ();
sw.Stop();
ShowTakenTime(sw.ElapsedMilliseconds);
}
我想要一些可以做的事情:
private void MeasureTime(Method m)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
m.Invoke();
sw.Stop();
ShowTakenTime(sw.ElapsedMilliseconds);
}
这样我就可以将LoadData方法传递给它,并为我完成剩下的工作。
MeasureTime(LoadData());
我该怎么做?
答案 0 :(得分:2)
对于没有参数且返回void的方法,您可以使用Action:
private void MeasureTime(Action m)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
m();
sw.Stop();
ShowTakenTime(sw.ElapsedMilliseconds);
}
如果您有某些参数或返回类型,请使用Func
答案 1 :(得分:1)
如果要将参数传递给方法m
,请使用操作&lt; ...&gt;,例如,如果要将int和字符串传递给Method,请使用Action<int,string>
private void MeasureTime(Action<int, string> m)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
m(42, "Hello World");
sw.Stop();
ShowTakenTime(sw.ElapsedMilliseconds);
}
如果您需要访问Method的返回值,请使用Func&lt; ...&gt;:
private void MeasureTime(Func<int, string, string> m)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
var result = m(42, "Hello World");
sw.Stop();
ShowTakenTime(sw.ElapsedMilliseconds);
}
答案 2 :(得分:0)
使用代理
private void MeasureTime(System.Action a)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
a();
sw.Stop();
ShowTakenTime(sw.ElapsedMilliseconds);
}
答案 3 :(得分:0)
您可以使用Action,因为您没有返回任何内容:
http://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx
MeasureTime(Action action)
Action act = LoadData;
act.Invoke();
答案 4 :(得分:0)
使用您想要的任何签名在您的班级中定义委托:
delegate int YourDelegate(string s);
获取委托并运行它的方法
void CallerMethod(YourDelegate method)
{
int result = method("");
}
方法将通过并与YourDelegate
兼容:
int MethodToPass(string s)
{
throw new exception();
}
将MethodToPass
传递给CallerMewthod
:
CallerMethod(MethodToPass);
您也可以使用支持任何类型输入和输出的预定义Func<output, inputType1, inputType2, ...>
通用委托来代替声明新委托