C# 在静态方法中使用Func作为参数对线程安全的好处

C# 在静态方法中使用Func作为参数对线程安全的好处,c#,multithreading,parallel-processing,async-await,thread-safety,C#,Multithreading,Parallel Processing,Async Await,Thread Safety,给定以下C#代码: 公共类信息 { 公共字符串状态{get;set;}=“Init”; } 公共静态类InfoHelper { 公共静态异步任务UpdateStatusV1(Func getInfo) { Info someInfo=getInfo(); someInfo.Status=“正在检查…”; 等待任务。延迟(1000);//模拟复杂而重要的工作 someInfo.Status=“已更新”; } 公共静态异步任务UpdateStatusV2(Info someInfo) { someI

给定以下C#代码:

公共类信息
{
公共字符串状态{get;set;}=“Init”;
}
公共静态类InfoHelper
{
公共静态异步任务UpdateStatusV1(Func getInfo)
{
Info someInfo=getInfo();
someInfo.Status=“正在检查…”;
等待任务。延迟(1000);//模拟复杂而重要的工作
someInfo.Status=“已更新”;
}
公共静态异步任务UpdateStatusV2(Info someInfo)
{
someInfo.Status=“正在检查…”;
等待任务。延迟(1000);//模拟复杂而重要的工作
someInfo.Status=“已更新”;
}
}
公共静态异步任务UpdateStatusV3(Func getInfo)
{
等待文档复杂而重要的工作v1();
异步任务文档复杂而重要的工作v1()
{
Info someInfo=getInfo();
等待任务。延迟(1000);//模拟复杂而重要的工作
someInfo.Status=“已更新”;
}
}
公共静态异步任务UpdateStatusV4(Info someInfo)
{
等待文档复杂而重要的工作v2();
异步任务文档复杂而重要的工作v2()
{
等待任务。延迟(1000);//模拟复杂而重要的工作
someInfo.Status=“已更新”;
}
}
InfoHelper.UpdateStatusV1在线程安全方面是否比InfoHelper.UpdateStatusV2有任何优势

InfoHelper.UpdateStatusV1“someInfo”对象的使用和修改是否比InfoHelper.UpdateStatusV2更安全


InfoHelper.UpdateStatusV3在线程安全方面是否比InfoHelper.UpdateStatusV4有任何优势?例如,保持调用方法的相同“someInfo”线程上下文?

没有任何有用的区别。函数更有用的次数:

  • 代码需要提供调用方不知道的参数
  • 代码需要能够使用不同的参数多次调用它
  • 代码需要在不同的时间点执行回调—可能是在
    wait

在这种情况下:与直接传入值相比,没有什么有用的区别。还有很多引入错误的方法。

使用
Func
不会改变线程方面的任何内容,它仍然只是一个被调用的函数。它完全取决于
getInfo
实际做了什么,以及
UpdatestatusV2
实际如何调用。任何一个都可以重用对象(因为状态是共享的,所以线程不安全);任何一个都可以创建一个新对象(使线程安全,因为没有共享状态)。(所有这一切首先都假设发生了任何不安全的事情;简单的引用分配是原子的,因此只有交错才是问题。)1。绝对没有,2。绝对不是。但是如果你只更改字符串属性,那么你就没有可能搞砸。最坏的情况是,由于竞争条件,标签显示错误的状态。谢谢你的回答。我增加了第三个和第四个例子,这个例子有点复杂。我刚刚用第三个和第四个例子更新了这个问题,使之更复杂。您的评论仍然有效吗?@S.A.在第三个示例中,委托调用发生在第一个
等待
之前(如果我们重新排序代码,使其编译),因此:没有任何更改。如果它发生在之后,我们就需要知道:我们是否应该期待在以后执行它会有什么影响?这有关系吗?如果是这样:那么是的,它可能会有用。如果没有,那就别指望你了。我正在查看需要更新和修改的遗留代码(不幸的是无法重新编写);我需要理解为什么一个参数有一个Func,没有输入参数作为参数传递给一个静态异步扩展方法。执行顺序可能会有所不同。。。我不确定someInfo是线程安全的
public class Info
{
    public string Status { get; set; } = "Init";
}

public static class InfoHelper
{
    public static async Task UpdateStatusV1(Func<Info> getInfo)
    {
        Info someInfo = getInfo();
        someInfo.Status = "Checking...";
        await Task.Delay(1000); // simulating complicated and important work
        someInfo.Status = "Updated";
    }

    public static async Task UpdateStatusV2(Info someInfo)
    {
        someInfo.Status = "Checking...";
        await Task.Delay(1000); // simulating complicated and important work
        someInfo.Status = "Updated";
    }
}

public static async Task UpdateStatusV3(Func<Info> getInfo)
{
    await DoComplicatedAndImportantWorkV1();

    async Task DoComplicatedAndImportantWorkV1()
    {
        Info someInfo = getInfo();
        await Task.Delay(1000); // simulating complicated and important work
        someInfo.Status = "Updated";
    }
}

public static async Task UpdateStatusV4(Info someInfo)
{
    await DoComplicatedAndImportantWorkV2();

    async Task DoComplicatedAndImportantWorkV2()
    {
        await Task.Delay(1000); // simulating complicated and important work
        someInfo.Status = "Updated";
    }
}