gpt4 book ai didi

c# - 正确了解异步/等待。正确吗?

转载 作者:行者123 更新时间:2023-12-03 13:16:47 31 4
gpt4 key购买 nike

想象以下情况。有一个UI,必须调用长时间运行的操作,而不会阻塞Main线程。长时间运行的操作会自行调用其他方法,这些方法不会与UI线程交互。

在大多数情况下,从方法B和C调用的方法具有异步替代方法的同步替代方法。问题是:可以安全地使用它们而不是使用异步方法吗?可以说是DbContext.DbSet.Add而不是AddAsync

// UI
public async Task UiMethodAsync()
{
var result = await MethodAAsync();
}

// some component
public async Task<bool> MethodAAsync()
{
return await MethodBAsync().ConfigureAwait(false);
}

public async Task<bool> MethodBAsync()
{
return await MethodCAsync().ConfigureAwait(false);
}

public async Task<bool> MethodCAsync()
{
return await DbContext.Set<TEntit>.AnyAsync().ConfigureAwait(false);
}

我的问题是:是否有必要使所有方法异步以防止UI线程阻塞,还是像这样使方法B和C同步就足够好了:
// UI
public async Task UiMethodAsync()
{
var result = await MethodAAsync();
}

// some component
public Task<bool> MethodAAsync()
{
return Task.FromResult(MethodB());
}

public bool MethodB()
{
return MethodC();
}

public bool MethodC()
{
return DbContext.Set<TEntit>.Any();
}

当然,这取决于MethodB和C在做什么,无论它们是否与ui线程交互。但是,让我们说他们没有,只需要计算事物并返回结果即可。

是否需要使它们也异步?我觉得不是。我认为这可以避免不必要的管理任务和线程的开销。

最佳答案

返回Task的方法将创建不会阻塞调用线程的期望。至少在相当长的时间内没有。但这不是由异步等待机制强制执行的。编写打破这种期望的方法是可能的,而且实际上非常容易。例如:

public Task DoStuffTheWrongWayAsync()
{
Thread.Sleep(1000); // Simulate a heavy computation, or a blocking call
return Task.CompletedTask;
}

任何调用此方法的线程将被阻塞一秒钟,然后将被交给完成的任务。我不知道此反模式是否具有确定的名称。假异步是要记住的,尽管这也可以用于 the case,即调用者没有被阻止,但是另一个不良线程被阻止了。最重要的是,行为良好的异步方法应立即返回 Task,使调用线程可以自由执行其他工作(例如,如果是UI线程,则响应UI事件)。

关于c# - 正确了解异步/等待。正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60830415/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com