如何在MVC C#中继续第二个方法之前等待第一个异步await方法?

时间:2019-11-25 15:37:49

标签: c# asp.net-mvc asynchronous timer async-await

我使用 async 任务 await 在mvc c#中创建了两种方法,这是我使用以下代码的第一个操作方法

Thread sendData = new Thread(async () => await SaveCustomerDataAsync(DocumentID, DocumentType, bytes, fileName));
sendData.Start();

现在,在我的提交上,单击此方法将在后台运行,并花一些时间将其标志设置为1的数据库保存到下一页,这是一种形式,我再次使用

int Flag = await repository.GetFlagStatus(DocumentID);

并且为了获取标志状态表单数据库表,我使用

public int GetFlagStatus(string documentID)
        {          
            var obj = (from a in db.StdPortals
                             select new StdPortalsVM
                             {
                                 DocumentID = a.DocumentID,
                                 Flag = a.Flag,
                             }).Where(x => x.DocumentID == documentID).FirstOrDefault();
          var  result = Convert.ToInt32(obj.Flag);
            return result;
        }

现在我的问题是,如何根据我第一个方法的输出结果等待第二个方法,直到我的第一个方法将数据保存到数据库中作为标志0或标志1。 我用了await Task.Delay(10000);等待第二种方法,但是如果数据保存在数据库中,我为什么还要等待10秒钟,而10秒钟的用户将等待它。

因此,要删除该部分,我使用计时器在5秒钟后检查数据库表行更新,并按如下方式修改我的代码

System.Threading.Timer Timer;
        System.DateTime StopTime;       
        public void Run(string documentId)
        {
            StopTime = System.DateTime.Now.AddMinutes(2);
            Timer = new System.Threading.Timer(TimerCallback, documentId, 0, 5000);      
        }
        private void TimerCallback(object state)
        {           
            if (System.DateTime.Now >= StopTime)
            {
                Timer.Dispose();
                return;              
            }
            else
            {
               var obj = (from a in db.StdPortals
                             select new StdPortalsVM
                             {
                                 DocumentID = a.DocumentID,
                                 Flag = a.Flag,
                             }).Where(x => x.DocumentID == documentID).FirstOrDefault();          
                if (obj != null)
                {
                    Timer.Dispose();
                    return;
                }
            }           
        }

因此,我得到以下错误 我也使用这种方法检查表,但出现相同的错误。

bool obj = db.StdPortals.Any(u => u.DocumentID == state.ToString())

System.InvalidOperationException:'在创建模型时无法使用上下文。如果在OnModelCreating方法内部使用上下文,或者多个线程同时访问同一上下文实例,则可能引发此异常。请注意,不能保证DbContext和相关类的实例成员是线程安全的。'

我希望您能理解我的查询,即如何在异步任务中等待或如何在5秒后检查数据库。 预先感谢。

1 个答案:

答案 0 :(得分:1)

  

Thread sendData = new Thread(async()=>等待SaveCustomerDataAsync(DocumentID,DocumentType,bytes,fileName));   sendData.Start();

您不应在现代代码中使用ThreadThread剩下的唯一用例是COM互操作,您无需在此处进行操作。请改用Task

Task sendData = Task.Run(async () => await SaveCustomerDataAsync(DocumentID, DocumentType, bytes, fileName));

Task除了是较小的代码外,还具有更好的检测完成和异常的方法。

例如,如果要异步等待sendData完成,则只需await

await sendData;
// SaveCustomerDataAsync has completed now.