【问题标题】:Async method error help me异步方法错误帮助我
【发布时间】:2017-10-02 06:36:21
【问题描述】:

这是简单的每日触发类,我从某个控制器调用此函数 ->("DailyTrigger(int hour, int minute, int second = 0)")。 下一次第一次工作(使用Task.delay)有错误

public class DailyTrigger
{
    readonly TimeSpan triggerHour;

    public DailyTrigger(int hour, int minute , int second = 0)
    {
        triggerHour = new TimeSpan(hour, minute, second);
        InitiateAsync();
    }

    async void InitiateAsync()
    {
        while (true)
        {
            var triggerTime = DateTime.Today + triggerHour - DateTime.Now;
            if (triggerTime < TimeSpan.Zero)
                triggerTime = triggerTime.Add(new TimeSpan(0,2,0));
            await Task.Delay(triggerTime);
            OnTimeTriggered?.Invoke();

        }
    }

从控制器中调用

var trigger = new DailyTrigger(13,01);
                trigger.OnTimeTriggered += () =>
                {
                    var res = AanModel.GetById<Company_Priority>(prio_obj.id);
                    res.version = "5";
                    res.Create();
                };

那个错误

"异步模块或处理程序在异步完成时完成 操作仍在等待中”

【问题讨论】:

标签: c# asynchronous


【解决方案1】:

这是异步编程的一个众所周知的问题。您最好阅读 jonpreece 撰写的 Quick tip: Avoid ‘async void’ 之类的文章,以了解其工作原理。

错误:

异步模块或处理程序在异步完成时完成 操作仍在等待中。

说明:

是的,你有一个竞争条件。在它之前返回的方法 执行完毕。在引擎盖下,框架并没有创建一个 方法的任务,因为该方法不返回任务。 因此在调用 FirstOrDefaultAsync 时,该方法不会暂停 执行,遇到错误。

解决方案:

要解决问题,只需更改方法的返回类型 从无效到任务。不用担心,您实际上不必返回 任何东西,并且编译器知道在以下情况下不会生成构建错误 没有退货声明。一个简单的修复,当你知道什么 问题是!

更新:

如果您仍想在构造函数中继续调用异步方法,那么您最好阅读 Stephen ClearyAsync OOP 2: Constructors

异步构造提出了一个有趣的问题。这将是 能够在构造函数中使用 await 很有用,但这意味着 构造函数必须返回一个代表 a 将在未来构造的值,而不是构造的 价值。这种概念很难融入 现有语言。

底线是不允许使用异步构造函数,所以让我们 探索一些替代方案。

如果你读得足够远,你会看到..

不该做的事

public sealed class MyClass
{
  private MyData asyncData;
  public MyClass()
  {
    InitializeAsync();
  }

  // BAD CODE!!
  private async void InitializeAsync()
  {
    asyncData = await GetDataAsync();
  }
}

最好去看看,这是一本非常有趣的读物。

【讨论】:

  • 感谢您的回复。但是我无法将 void 更改为 Task 因为我从 public DailyTrigger(int,int,int) 调用 iInitiateAsync() 。我必须等待 InitiateAsync();因为没有等待那个电话。
猜你喜欢
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 2016-08-04
相关资源
最近更新 更多