如何在多线程环境中只执行一次挡路代码?

How to execute a block of code only once on a multithreading environment?(如何在多线程环境中只执行一次挡路代码?)
本文介绍了如何在多线程环境中只执行一次挡路代码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的代码挡路在C#中执行对象加载。

public bool IsModelLoaded { get; set; }
public override MyObject Load()
{
    if (!IsModelLoaded)
    {
        Model = MyService.LoadMyObject(Model);
        IsModelLoaded = true;
    }
    return Model;
}

我的目的是只运行此挡路一次,因此只加载Model一次。不过,此代码挡路从2个不同的线程运行了两次。

如何确保此挡路只运行一次?(在多个线程上)。

推荐答案

最简单的方法是添加

[MethodImpl(MethodImplOptions.Synchronized)]
public override MyObject Load()
{
   //snip
}
但请注意,这会锁定整个对象,而不仅仅是方法。不是很好的练习。

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx

已同步

指定该方法一次只能由一个线程执行。静电方法锁定类型,而实例方法锁定实例。在任何实例函数中只能执行一个线程,在类的任何静电函数中只能执行一个线程。

这篇关于如何在多线程环境中只执行一次挡路代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

C# Windows Application - Many threads using the same connection?(C# Windows 应用程序 - 许多线程使用相同的连接?)
Multithreaded .NET queue problems(多线程 .NET 队列问题)
How do I access GUI (GTK) from multi threads?(如何从多线程访问 GUI (GTK)?)
multi-threading based RabbitMQ consumer(基于多线程的 RabbitMQ 消费者)
.NET#39;s Multi-threading vs Multi-processing: Awful Parallel.ForEach Performance(.NET 的多线程与多处理:糟糕的 Parallel.ForEach 性能)
COM multi-threading support(COM 多线程支持)