异步/等待简单示例

4

我正在尝试通过创建一个简单的例子来理解异步/等待的基本原理。 我正在使用带有异步连接的Sqlite,并且我有一个类如下:

public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

现在假设我想将一个User保存到我的UserTable中,当保存完成后,我希望能够检索它。

public async ? SaveToDb()
        {
            _conn.CreateTableAsync<User>();
            await _conn.InsertAsync(new User(){Id=1, Name = "Bill"});

            //Code that waits for the save to complete and then retrieves the user
        }

我怀疑我需要在某个地方创建一个任务,但我不完全确定如何做到这一点。谢谢。


https://msdn.microsoft.com/en-us/library/hh191443.aspx http://www.dotnetperls.com/async https://dev59.com/NmYq5IYBdhLWcg3weQgy 还有许多您可以参考的示例。 - Vinod
1
我怀疑如果没有许多地方的实例,C#中的async/await就不可能存在这么长时间。正如@Vinod所链接的那样,简单的搜索就可以找到这些示例以及更多的内容。 - Lukazoid
1
在等待 InsertAsync 之前,您还需要等待 CreateTableAsync - Jon Hanna
2个回答

7
你已经基本上完成了。
当返回 void 时:
public async Task SomethingAsync()
{
    await DoSomethingAsync();
}

返回结果时:

public async Task<string> SomethingAsync()
{
    return await DoSomethingAsync();
}

在异步方法中返回值时需要注意的是,应该返回内部类型(即在这种情况下的string),而不是Task<string>实例。

1
嗯...你真的应该只做return DoSomethingAsync();并从签名中删除async - Aron
@Aron 如果我没记错的话,如果他正在方法内等待,那就不行了吧? - Lloyd
不需要编译器解开Task,然后将结果包装在另一个Task中。DoSomethingAsync()已经返回了一个Task,所以你不需要await它。 - Aron

1
如果您的代码不返回任何值,则签名应该是这样的,返回Task
public async Task SaveToDb()

否则,您需要在Task<T>中将返回类型作为类型参数进行指定,在此示例中为string
public async Task<string> SaveToDb()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接