使用异步方法设置属性

时间:2016-08-26 16:06:31

标签: c# asynchronous async-await

可以更改各种扩展方法以允许下面单元测试中的FireAndForget调用比我更优雅吗?

using System;
using System.Threading.Tasks;
namespace MyNamespace
{
  public static class AsyncAdditions
  {
    private static async Task FireAndForgetInternal<T>(Func<Task<T>> task, Action<T> completion) {
      T value = await task();
      completion(value);
    }

    public static void FireAndForget<T>(Func<Task<T>> task, Action<T> completion) {
      AsyncAdditions.FireAndForgetInternal(task, completion).DoNotAwait();
    }

    /// <summary>Empty method gets rid of stupid compiler warning</summary>
    public static void DoNotAwait(this Task task) {}
  }
}

测试:

using System;
using System.Threading.Tasks;
using NUnit.Framework;
using MyNamespace;

namespace MyTests
{
  [TestFixture()]
  public class AsyncTests
  {
    public async Task<int> GetAsyncInteger()
    {
      return await Task.Factory.StartNew(() => 6);
    }

    public int MyNumber { get; set;}

    public void SlowSynchronousJob() {
      for (int i = 0; i < 1E7; i++) {
      }
    }

    [Test()]
    public void TestSetter() {
      AsyncAdditions.FireAndForget(this.GetAsyncInteger, n => this.MyNumber = n);
      this.SlowSynchronousJob();
      Assert.AreEqual(6, this.MyNumber);
    }
  }
}

0 个答案:

没有答案