Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绕着异步等待_C#_.net_Asynchronous - Fatal编程技术网

C# 绕着异步等待

C# 绕着异步等待,c#,.net,asynchronous,C#,.net,Asynchronous,请原谅这个明显的新手问题。关于async和Wait,我没有领会到一些东西 为了使方法异步,它必须等待同样异步的任务/方法返回。对的但在某个时刻,是否一定要有一个非异步的任务,或者不等待任何东西 我一直在阅读以下两个教程: 我在这里看到了很多其他的线索。但还有一些事情我不明白。我将尝试给出一个简单的例子。假设我想向数据库中的列写入一个值: public async Task<SimpleObject> ExecuteAsync(int rowID, string value)

请原谅这个明显的新手问题。关于async和Wait,我没有领会到一些东西

为了使方法异步,它必须等待同样异步的任务/方法返回。对的但在某个时刻,是否一定要有一个非异步的任务,或者不等待任何东西

我一直在阅读以下两个教程:

我在这里看到了很多其他的线索。但还有一些事情我不明白。我将尝试给出一个简单的例子。假设我想向数据库中的列写入一个值:

 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),因此,您将在第一条线上等待。