gpt4 book ai didi

c# - List<>.ForEach() 中的线程不安全异步

转载 作者:行者123 更新时间:2023-12-02 19:19:08 25 4
gpt4 key购买 nike

为什么在 .ForEach() 中执行 await 是线程不安全的?

在 .Net Core 3.1 项目中,我从一些 WebApi(匹配条件的用户列表)中进行选择,然后删除它们,最后再次请求用户列表。当然,这次我希望列表为空。

错误代码

    var existing = (await client.GetByMatchAsync(new SearchParameters() {..})).ToList();

existing.ForEach(async x => await client.DeleteByIdAsync(x.Id));

var ensure = (await client.GetByMatchAsync(new SearchParameters() {..})).ToList();
ensure.Count.Should().Be(0); <-- ERROR WAS 1!

我发现,当我在 var 确保 之前插入 Thread.Sleep(50) 时,代码可以正常工作。这清楚地向我表明存在我不明白的线程问题。

工作代码(使用延迟)

            var existing = (await client.GetByMatchAsync(new SearchParameters() {..})).ToList();

existing.ForEach(async x => await client.DeleteByIdAsync(x.Id));
Thread.Sleep(50);

var ensure = (await client.GetByMatchAsync(new SearchParameters() {..})).ToList();
ensure.Count.Should().Be(0);

替代工作代码(使用foreach)

            var existing = (await client.GetByMatchAsync(new SearchParameters() {..})).ToList();

foreach (var x in existing)
{
await client.DeleteByIdAsync(x.Id);
}

var ensure = (await client.GetByMatchAsync(new SearchParameters() {..})).ToList();
ensure.Count.Should().Be(0);

反编译.ForEach()我看不到线程问题发生在哪里

    public void ForEach(Action<T> action)
{
if (action == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.action);
}

int version = _version;

for (int i = 0; i < _size; i++)
{
if (version != _version)
{
break;
}
action!(_items[i]);
}

if (version != _version)
ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion();
}

最佳答案

List 的 ForEach 只需要 Action<T>因此每次迭代都不会等待您提供的操作,并且可以在调用完成之前继续执行。

否则签名可能会过载

Task ForEach(Func<T, Task> func)

我觉得奇怪的是下面的行可以编译,但是你不能分配 Func<T, Task>Action<T> .

Action<string> a = async (value) => await Task.CompletedTask;

您可以通过这种方式调用 ForEach 的事实具有误导性。

existing.ForEach(async x => await client.DeleteByIdAsync(x.Id));

关于c# - List<>.ForEach() 中的线程不安全异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63282700/

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