C# 绕着异步等待
请原谅这个明显的新手问题。关于async和Wait,我没有领会到一些东西 为了使方法异步,它必须等待同样异步的任务/方法返回。对的但在某个时刻,是否一定要有一个非异步的任务,或者不等待任何东西 我一直在阅读以下两个教程: 我在这里看到了很多其他的线索。但还有一些事情我不明白。我将尝试给出一个简单的例子。假设我想向数据库中的列写入一个值:C# 绕着异步等待,c#,.net,asynchronous,C#,.net,Asynchronous,请原谅这个明显的新手问题。关于async和Wait,我没有领会到一些东西 为了使方法异步,它必须等待同样异步的任务/方法返回。对的但在某个时刻,是否一定要有一个非异步的任务,或者不等待任何东西 我一直在阅读以下两个教程: 我在这里看到了很多其他的线索。但还有一些事情我不明白。我将尝试给出一个简单的例子。假设我想向数据库中的列写入一个值: public async Task<SimpleObject> ExecuteAsync(int rowID, string value)
public async Task<SimpleObject> ExecuteAsync(int rowID, string value)
{
return await WriteToDB(int rowID, string value);
}
public异步任务ExecuteAsync(int-rowID,字符串值)
{
返回wait wait WriteToDB(int rowID,字符串值);
}
到目前为止还不错。但是,这里是我迷路的地方:
public async Task<SimpleObject> WriteToDB(int rowID, string value)
{
var dataRow = context. /// use linq to get a row with rowID
dataRow.SomeColumn = value
context.SaveChanges();
var simpleObject = new SimpleObject();
simpleObject.success = true;
return simpleObject;
}
public class SimpleObject
{
public bool success {get;set;}
}
公共异步任务WriteToDB(int-rowID,字符串值)
{
var dataRow=context.///使用linq获取具有rowID的行
dataRow.SomeColumn=值
SaveChanges();
var simpleObject=new simpleObject();
simpleObject.success=true;
返回simpleObject;
}
公共类SimpleObject
{
公共bool成功{get;set;}
}
VS非常礼貌地通知我,我的方法
WriteToDB()
缺少wait
,将同步运行。我仍然可以编译,并且不会出现运行时错误。但是,我不知道如何在WriteToDB()中使用wait
,
,您需要使用.SaveChangesAsync方法
public async Task<SimpleObject> WriteToDB(int rowID, string value)
{
var dataRow = context.
dataRow.SomeColumn = value
await context.SaveChangesAsync(); //change this line
var simpleObject = new SimpleObject();
simpleObject.success = true;
return simpleObject;
}
公共异步任务WriteToDB(int-rowID,字符串值)
{
var dataRow=上下文。
dataRow.SomeColumn=值
wait context.saveChangesSync();//更改此行
var simpleObject=new simpleObject();
simpleObject.success=true;
返回simpleObject;
}
EntityFramework支持如SaveChangesSync和ToListSync,这些异步方法遵循并返回您可以等待的任务或任务。
您可以重写代码,以异步方式执行查询和保存,如下所示:
public async Task<SimpleObject> WriteToDB(int rowID, string value)
{
var dataRow = await context.table.SingleAsync(item =>item.Id = /*some value*/);
dataRow.SomeColumn = value
await context.SaveChangesAsync();
var simpleObject = new SimpleObject();
simpleObject.success = true;
return simpleObject;
}
公共异步任务WriteToDB(int-rowID,字符串值)
{
var dataRow=await context.table.SingleAsync(item=>item.Id=/*some value*/);
dataRow.SomeColumn=值
wait context.saveChangesSync();
var simpleObject=new simpleObject();
simpleObject.success=true;
返回simpleObject;
}
我将尝试给出一个简单的例子
正如其他人所指出的,简单示例的简单答案是“使用savechangesync
而不是SaveChanges
”
要回答“如何开始使用异步”这一更广泛的问题,最好的方法是:
识别代码库中的自然异步操作。这些通常是I/O操作。在本例中,保存对数据库的更改
将这些API更改为使用异步API,并使用wait
。在本例中,将SaveChanges
更改为wait savechangesync
编译器将通知您将包含方法更改为使用async
,它还将为您提供要使用的正确返回类型。在本例中,编译器将指示您将simpleobjectwritetodb(..)
更改为async Task WriteToDBAsync(..)
重复步骤(2)和(3),直到应用程序编译。在本例中,步骤(2)将更改调用返回WriteToDB(int rowID,string value)
to返回wait wait WriteToDBAsync(int rowID,字符串值)代码>和步骤(3)将simpleobjectexecute(..)
更改为async Task ExecuteAsync(..)
以这种方式应用async
/wait
要容易得多,从最低级别开始,然后从最低级别开始增长
但在某个时刻,是否一定要有一个非异步的任务,或者不等待任何东西
对。最低级别的方法通常由TaskFactory实现。FromAsync
或TaskCompletionSource
EF中是否没有saveChangesSync()
方法?可能相关文章:“不仅有saveChangesSync,还有许多用于数据检索的异步方法(如FirstAsync或ToListSync),因此,您将在第一条线上等待。