我使用 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秒后检查数据库。 预先感谢。
答案 0 :(得分:1)
Thread sendData = new Thread(async()=>等待SaveCustomerDataAsync(DocumentID,DocumentType,bytes,fileName)); sendData.Start();
您不应在现代代码中使用Thread
; Thread
剩下的唯一用例是COM互操作,您无需在此处进行操作。请改用Task
:
Task sendData = Task.Run(async () => await SaveCustomerDataAsync(DocumentID, DocumentType, bytes, fileName));
Task
除了是较小的代码外,还具有更好的检测完成和异常的方法。
例如,如果要异步等待sendData
完成,则只需await
:
await sendData;
// SaveCustomerDataAsync has completed now.