我如何在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(或匿名方法?)将上述字符串串在一起,所以我不必为延续定义命名函数?

请尽可能多地解释一下新的语法,因为我还在努力理解这个概念。

多谢!

我如何在c# lambda语法中编写以下回调延续

如果我们有以下方法:

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表达式,你可以去掉参数周围的括号(如果只有一个参数)和参数的类型,因为编译器通常可以推断它们,但我这样写是为了尽量让你更好地了解发生了什么。