【发布时间】:2022-01-27 21:16:00
【问题描述】:
我有一个异步方法,它将通过实体框架从数据库中加载一些信息。
在一种情况下,我想从锁中同步调用该代码。
我需要两份代码,一份是异步的,一份不需要,还是有办法同步调用异步代码?
例如这样的:
using System;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
new Test().Go();
}
}
public class Test
{
private object someLock = new object();
public void Go()
{
lock(someLock)
{
Task<int> task = Task.Run(async () => await DoSomethingAsync());
var result = task.Result;
}
}
public async Task<int> DoSomethingAsync()
{
// This will make a database call
return await Task.FromResult(0);
}
}
编辑:由于许多 cmets 都在说同样的话,我想我会详细说明一下
背景:通常,尝试这样做是个坏主意。 Lock 和 async 是相反的,正如许多地方所记录的那样,没有理由在 lock 中进行异步调用。
那么为什么要在这里做呢?我可以同步进行数据库调用,但这需要复制一些不理想的方法。理想情况下,该语言可以让您同步或异步调用相同的方法
场景:这是一个 Web API。应用程序启动,许多 Web API 调用执行,它们都需要数据库中的一些信息,这些信息由专门用于此目的的服务提供商提供(即通过 Startup.cs 中的 AddScoped 添加的调用)。如果没有锁之类的东西,他们都会尝试从数据库中获取信息。 EF Core 的相关性仅在于对数据库的所有其他调用都是异步的,这是一个例外。
【问题讨论】:
-
这能回答你的问题吗? Calling async method synchronously
-
我的建议是首先不要使用同步代码。你不能做一些重构来正确地做所有事情吗?
-
你不能在锁中使用异步代码,它需要一个锁
-
我不知道锁是否引入了一些我需要注意的微妙问题,这使得它与其他问题略有不同
-
@tony 我猜它不需要锁;它需要同步,并且您对使用
lock很熟悉 - 但是:它不是唯一的选择。
标签: c# async-await entity-framework-core