我如何在c# lambda语法中编写以下回调延续
本文关键字:延续 回调 语法 lambda | 更新日期: 2023-09-27 18:09:10
我正在写一个异步单元测试,我想用lambdas(或匿名方法?)将它串在一起,所以我不必为延续定义命名函数。
我读过几篇关于lambdas的文章,但其中大多数都是针对我不感兴趣的每种风格结构。
我想做如下的事情(摘自这里):
using Microsoft.Silverlight.Testing;
using Microsoft.VisualStudio.TestTools.UnitTesting;
{
[TestClass]
public class Test2 : SilverlightTest
{
[TestMethod]
[Asynchronous]
public void TestAsync1()
{
var eventRaised = false;
var result = false;
var timer = new System.Windows.Threading.DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(2);
timer.Tick += (object sender, EventArgs e) =>
{
timer.Stop();
// Simulate an expected result
result = true;
// Mark the event has being raised
eventRaised = true;
};
// Start timer
EnqueueCallback(() => timer.Start());
// Wait until event is raised
EnqueueConditional(() => eventRaised);
EnqueueCallback(() =>
{
// Additional tasks can be added here
Assert.IsTrue(result);
});
EnqueueTestComplete();
}
}
}
但我想我不需要EnqueueCallback()的东西。
下面是我不使用lambda的代码:
[TestClass]
public class IdentityEditDatabaseTest : WorkItemTest
{
[TestMethod, Asynchronous] public void testNullInsert()
{
wipeTestData(testNullInsertContinue1);
}
private void testNullInsertContinue1(String errorString)
{
IdentityProperties properties = new IdentityProperties(getContext());
properties.setUserName(DATABASE_TEST);
postUserEdit(properties, testNullInsertContinue2);
}
private void testNullInsertContinue2(String errorString)
{
Assert.assertTrue(errorString == null);
wipeTestData(testNullInsertContinue3);
}
private void testNullInsertContinue3(String errorString)
{
TestComplete();
}
}
...
问题是:
我如何使用lambdas(或匿名方法?)将上述字符串串在一起,所以我不必为延续定义命名函数?
请尽可能多地解释一下新的语法,因为我还在努力理解这个概念。
多谢!
如果我们有以下方法:
private void DoSomething(object argument)
{
// Do something with the argument here
}
你可能知道它可以像这样分配给一个委托变量:
Action<object> asDelegate = DoSomething;
要使用匿名方法进行相同的赋值,可以使用lambda表达式:
Action<object> asDelegate = (object argument) =>
{
// Do something with the argument here
}
在你的例子中,方法testNullInsert可以这样写:
[TestMethod, Asynchronous]
public void testNullInsert()
{
wipeTestData((string errorString) =>
{
IdentityProperties properties = new IdentityProperties(getContext());
properties.setUserName(DATABASE_TEST);
postUserEdit(properties, testNullInsertContinue2);
});
}
我所做的就是用包含相同功能的lambda表达式替换了名称testNullInsertContinue1。如果你愿意,你也可以对testNullInsertContinue2做同样的事情。
一旦你更熟悉使用lambda表达式,你可以去掉参数周围的括号(如果只有一个参数)和参数的类型,因为编译器通常可以推断它们,但我这样写是为了尽量让你更好地了解发生了什么。