


Explication détaillée de la synchronisation .NET et du Mutex asynchrone
Cet essai continue : Synchronisation .NET et collection thread-safe asynchrone (11)
Cet essai et les deux essais suivants présenteront la dernière partie majeure de la série de points de connaissances sur la synchronisation .NET et les blocs asynchrones. : Famille WaitHandle.
Classe de base abstraite : WaitHandle, trois sous-classes : EventWaitHandle (notification d'événement), Mutex (verrouillage de synchronisation de processus), Semaphone (sémaphore) et deux petits-enfants : System.Threading.AutoResetEvent, System Threading.ManualResetEvent. sous-classes de EventWaitHandle.
1. Classe de base abstraite WaitHandle
[ComVisibleAttribute(true)]public abstract class WaitHandle : MarshalByRefObject, IDisposable
Grâce aux informations ci-dessus, nous pouvons savoir que WaitHandle hérite de MarshalByRefObject et implémente l'interface IDisposable.
Vous n'êtes peut-être pas très familier avec MarshalByRefObject, mais vous aurez certainement utilisé plusieurs de ses sous-classes. Laissez-nous vous révéler son vrai visage.
MarshalByRefObject est décrit dans MSND comme suit :
Le domaine d'application est une partition où une ou plusieurs applications résident dans un processus du système d'exploitation. Les objets d'un même domaine d'application communiquent directement. Les objets de différents domaines d'application peuvent communiquer de deux manières : en transférant des copies d'objets au-delà des limites du domaine d'application ou en utilisant des proxys pour échanger des messages. MarshalByRefObject est une classe de base pour les objets qui communiquent au-delà des limites du domaine d'application en échangeant des messages à l'aide de proxys.
Vous pourriez être encore plus confus après avoir vu ceci. L'ai-je utilisé ? Vous avez utilisé ses sous-classes ? C'est vrai, ses sous-classes ont été utilisées, et il y en a bien d'autres.
Par exemple, Brush, Image, Pen, Font, etc. dans l'espace de noms System.Drawing, et il existe également le Stream plus familier sous l'espace de noms System.IO.
Lecture approfondie : Utilisez MarshalByRefObject implémente AOP.
Voyant cela, il nous suffit de savoir que WaitHandle a la capacité de communiquer entre les domaines d'application.
2. Mutex (verrouillage de synchronisation des processus)
1. MSDN définit Mutex comme la primitive de synchronisation entre les processus, c'est-à-dire le concept de verrouillage.
D'un autre côté, Monitor n'est généralement utilisé que pour communiquer entre les threads du domaine d'application. En fait, Monitor peut également fournir un verrouillage dans plusieurs domaines d'application si l'objet utilisé pour le verrouillage est dérivé de MarshalByRefObject.
Étant donné que Mutex doit appeler les ressources du système d'exploitation, sa surcharge d'exécution est bien supérieure à celle de Monitor. Par conséquent, si vous avez uniquement besoin de synchroniser les opérations entre les threads au sein de l'application, Monitor/lock devrait être le premier choix
.2. Utilisation du Mutex
WaitOne() /WaitOne(TimeSpan, Boolean) et plusieurs surcharges : demande de propriété, cet appel se bloquera jusqu'à ce que le mutex actuel reçoive un signal, ou jusqu'à ce que lorsque l'intervalle de délai d'attente facultatif soit atteint, aucune de ces méthodes n'a besoin de fournir un objet de verrouillage comme paramètre supplémentaire.
Vous pouvez utiliser la méthode WaitHandle.WaitOne pour demander la propriété d'un mutex. Le fil appelant est bloqué jusqu'à ce que l'un des événements suivants se produise :
Le mutex signale la non-propriété. Dans ce cas, la méthode WaitOne renverra true, prenant la propriété mutex du thread appelant et accédant à la ressource protégée par le mutex. Une fois que le thread a fini d'accéder aux ressources, la méthode ReleaseMutex doit être appelée pour libérer la propriété du mutex.
a la méthode millisecondsTimeout ou le paramètre timeout est passé . Dans ce cas, la méthode WaitOne renverra false et le thread ne prendra pas possession du mutex pour le moment.
ReleaseMutex() : Libère le Mutex actuel une fois. Notez que cela est souligné une fois, car le thread qui possède le mutex peut appeler à plusieurs reprises la série de fonctions WaitOne sans bloquer son exécution ; ceci et Enter()/Exit() du moniteur peuvent être appelés à plusieurs reprises après avoir acquis le verrou d'objet. Le nombre de fois que Mutex est appelé est enregistré par le Common Language Runtime (CLR). Le nombre est de +1 pour chaque WaitOne() et de -1 pour chaque ReleaseMutex(). Tant que ce nombre n'est pas 0, les autres serveurs Mutex le feront. considérez ce Mutex S'il n'est pas publié, il n'y a aucun moyen d'obtenir le Mutex. De plus, comme Monitor.Exit(), seul le propriétaire du Mutex peut RleaseMutex(), sinon une exception sera levée.
Si le thread se termine alors que vous possédez le mutex, nous disons que le mutex est abandonné. Dans MSDN, Microsoft prévient qu'il s'agit d'une erreur de programmation « grave ». Cela signifie qu'une fois que le propriétaire du mutex en a obtenu la propriété, le nombre de WaitOne() et ReleaseMutex() est inégal et l'appelant lui-même se termine de manière irresponsable, ce qui entraîne la ressource protégée par le mutex dans un état incohérent. En fait, ce n'est rien de plus qu'un rappel de n'oubliez pas d'utiliser Mutex dans la structure try/finally.
3、全局和局部的Mutex
如果在一个应用程序域内使用Mutex,当然不如直接使用Monitor/lock更为合适,因为前面已经提到Mutex需要更大的开销而执行较慢。不过Mutex毕竟不是Monitor/lock,它生来应用的场景就应该是用于进程间同步的。用于在进程间通讯的Mutex我们称为全局Mutex,而只用于在应用程序域内部通讯的Mutex、我们称为局部Mutex.
全局Mutex和局部Mutex是通过构造函数来构造不同的实例的,让我们来看一下Mutex的构造函数,一共有5个,挑两个具有代表性的看一下吧:
Mutex():用无参数的构造函数得到的Mutex没有任何名称,而进程间无法通过变量的形式共享数据,所以没有名称的Mutex也叫做局部(Local)Mutex。另外,这样创建出的Mutex,创建者对这个实例并没有拥有权,仍然需要调用WaitOne()去请求所有权。
Mutex(Boolean initiallyOwned, String name, out Booldan createdNew, MutexSecurity):第一个bool参数:指示初始化的实例是否拥有互斥体所有权。第二个string类型、为互斥体指定一个名称,如果string为null或者空字符串 则相当于创建一个没有名字的Mutex,当属于局部Mutex. 而有名字的Mutex当属于全局Mutex.第三个bool参数、如果已经初始化了互斥体 返回True, 如果互斥体已经存在则返回False. 最后一个参数用于Mutex访问的安全性控制。
4、用途
Mutex天生为进程间的同步基元,因此它可以用来控制应用程序的单实例:
/// <summary>/// 单实例运行/// </summary>/// <returns> true 应用程序已启动,false 则没有 </returns>public bool SingleRun(ref System.Threading.Mutex mutex ) { mutex = new System.Threading.Mutex(false, "WINDOWS"); if (!mutex.WaitOne(0, false)) { mutex.Close(); mutex = null; } if (mutex == null) { return true; } return false; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

De manière générale, nous n'avons besoin d'utiliser qu'un seul casque ou haut-parleur en même temps. Cependant, certains amis ont signalé que dans le système Win11, ils ont rencontré le problème du son des écouteurs et des haut-parleurs en même temps. désactivez-le dans le panneau Realtek et tout ira bien, jetons un œil ci-dessous. Que dois-je faire si mes écouteurs et mes haut-parleurs sonnent ensemble dans Win11 ? 1. Recherchez et ouvrez d'abord le "Panneau de configuration" sur le bureau 2. Accédez au panneau de configuration, recherchez et ouvrez "Matériel et son" 3. Recherchez ensuite le ". Realtek High Definition" avec une icône de haut-parleur. Audio Manager" 4. Sélectionnez "Haut-parleurs" et cliquez sur "Panneau arrière" pour entrer les paramètres des haut-parleurs. 5. Après ouverture, nous pouvons voir le type d'appareil. Si vous souhaitez éteindre les écouteurs, décochez « Écouteurs ».

Lorsque vous constatez qu'un ou plusieurs éléments de votre dossier de synchronisation ne correspondent pas au message d'erreur dans Outlook, cela peut être dû au fait que vous avez mis à jour ou annulé des éléments de réunion. Dans ce cas, vous verrez un message d'erreur indiquant que votre version locale des données est en conflit avec la copie distante. Cette situation se produit généralement dans l'application de bureau Outlook. Un ou plusieurs éléments du dossier que vous avez synchronisé ne correspondent pas. Pour résoudre le conflit, ouvrez les projets et retentez l'opération. Réparer Un ou plusieurs éléments dans les dossiers synchronisés ne correspondent pas à l'erreur Outlook Dans la version de bureau d'Outlook, vous pouvez rencontrer des problèmes lorsque des éléments du calendrier local entrent en conflit avec la copie du serveur. Heureusement, il existe des moyens simples d’aider

Le développement des technologies d’intelligence artificielle (IA) bat son plein aujourd’hui et elles ont montré un grand potentiel et une grande influence dans divers domaines. Aujourd'hui, Dayao partagera avec vous 4 cadres de projets liés au modèle d'IA open source .NET LLM, dans l'espoir de vous fournir une référence. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel est un kit de développement logiciel (SDK) open source conçu pour intégrer de grands modèles de langage (LLM) tels qu'OpenAI, Azure

Que vous soyez débutant ou professionnel expérimenté, la maîtrise du C# ouvrira la voie à votre carrière.

Application rapide : analyse de cas de développement pratique de PHP Téléchargement HTTP asynchrone de plusieurs fichiers Avec le développement d'Internet, la fonction de téléchargement de fichiers est devenue l'un des besoins fondamentaux de nombreux sites Web et applications. Pour les scénarios dans lesquels plusieurs fichiers doivent être téléchargés en même temps, la méthode de téléchargement synchrone traditionnelle est souvent inefficace et prend du temps. Pour cette raison, utiliser PHP pour télécharger plusieurs fichiers de manière asynchrone via HTTP est devenu une solution de plus en plus courante. Cet article analysera en détail comment utiliser le HTTP asynchrone PHP à travers un cas de développement réel.

Une fonction très utile du presse-papiers Win10 est la fonction de stockage cloud multi-appareils, qui est très utile et peut aider les utilisateurs à copier et coller simultanément sur des appareils PC et des appareils mobiles. La méthode de configuration est très simple, il suffit de la définir dans le presse-papiers du système. Synchroniser le presse-papiers Win10 avec le téléphone mobile 1. Cliquez d'abord sur Démarrer dans le coin inférieur gauche pour entrer les paramètres. 2. Cliquez ensuite sur « Système ». 3. Sélectionnez « Presse-papiers » sur la gauche. 4. Enfin, cliquez sur Connexion dans « Synchronisation multi-appareils » à droite, puis sélectionnez votre téléphone mobile.

Programmation simultanée et asynchrone La programmation simultanée traite de plusieurs tâches s'exécutant simultanément, la programmation asynchrone est un type de programmation simultanée dans laquelle les tâches ne bloquent pas les threads. asyncio est une bibliothèque de programmation asynchrone en python, qui permet aux programmes d'effectuer des opérations d'E/S sans bloquer le thread principal. Boucle d'événements Le cœur d'asyncio est la boucle d'événements, qui surveille les événements d'E/S et planifie les tâches correspondantes. Lorsqu'une coroutine est prête, la boucle d'événements l'exécute jusqu'à ce qu'elle attende les opérations d'E/S. Il met ensuite la coroutine en pause et continue d'exécuter d'autres coroutines. Coroutines Les coroutines sont des fonctions qui peuvent suspendre et reprendre l'exécution. Le mot-clé asyncdef est utilisé pour créer des coroutines. La coroutine utilise le mot-clé wait pour attendre la fin de l'opération d'E/S. Les bases suivantes d'asyncio

Comment synchroniser Baidu Cloud Sync Disk ? Vous pouvez sélectionner les fichiers à synchroniser dans Baidu Cloud Sync Disk, mais la plupart des utilisateurs ne savent pas comment synchroniser les fichiers Baidu Cloud. Voici ensuite le didacticiel graphique de la méthode de synchronisation Baidu Cloud Sync Disk proposé par l'éditeur. pour les utilisateurs intéressés, venez jeter un oeil ! Comment synchroniser Baidu Cloud Sync Disk 1. Entrez d'abord sur le bureau de l'ordinateur, cliquez avec le bouton droit sur l'icône [Baidu Cloud Sync Disk] et sélectionnez [Paramètres] 2. Développez ensuite la fenêtre du service, passez à la page [Paramètres avancés] et cliquez sur ; [Sélectionner un dossier] ; 3. Enfin, passez à la page comme indiqué ci-dessous, vérifiez les fichiers qui doivent être synchronisés et cliquez sur [OK].
