je ne comprends pas la notion de domaine de synchronisation dans la
m=E9thode WaitHandle.WaitOne(int, bool).
Pour l'exemple, j'ai deux classes:
- Class1, d=E9rivant de ContextBoundObject d=E9cor=E9 de l'attribut
[System.Runtime.Remoting.Synchronization]
- Class2 sans attribut de synchronisation.
Dans le Main(), j'ai deux threads portant sur la m=EAme instance de
Class1 qui s'=E9x=E9cutent en parall=E8le.
La m=E9thode Display() cr=E9e une instance de Class2 et appelle une de
ses m=E9thodes en asynchrone.
Je fais un WaitOne sur le IAsyncResult en sp=E9cifiant "true" pour le
bool=E9en de sortie de contexte.
Voici le code du bouzin :
class Program
{
static void Main()
{
Class1 c1 =3D new Class1();
Thread t1 =3D new Thread(c1.Display);
Thread t2 =3D new Thread(c1.Other);
t1.Start(); t2.Start();
t1.Join(); t2.Join();
}
}
[Synchronization()]
class Class1 : ContextBoundObject
{
public void Display()
{
Console.WriteLine("Class1.Display()");
Class2 c2 =3D new Class2();
IAsyncResult ar =3D c2.BeginDisplay();
ar.AsyncWaitHandle.WaitOne(-1, true);
}
public void Other()
{
Console.WriteLine("Class1.Other()");
}
}
class Class2
{
delegate void MyDelegate();
public void Display()
{
Console.WriteLine("Class2.Display()");
Thread.Sleep(3000);
}
public IAsyncResult BeginDisplay()
{
MyDelegate d =3D new MyDelegate(Display);
return d.BeginInvoke(null, null);
}
}
Je pensais que le premier thread l=E2cherait le verrou sur Class1 au
profit du second thread au moment du WaitOne.
Or, il n'en est rien.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Zim
Pour ceux que celà interesserait, le comportement par défaut d'une classe ContextBound est que la réentrance n'est pas autorisée. Le thread garde le verrou même en dans la cas de la sortie de contexte. Dans l'exemple ci-dessus, T1 lâche le verrou lors du WaitOne si l'attribut de synchronisation à la booléen reEntrant à true : [Synchronization(true)].
Pour ceux que celà interesserait, le comportement par défaut d'une
classe ContextBound est que la réentrance n'est pas autorisée. Le
thread garde le verrou même en dans la cas de la sortie de contexte.
Dans l'exemple ci-dessus, T1 lâche le verrou lors du WaitOne si
l'attribut de synchronisation à la booléen reEntrant à true :
[Synchronization(true)].
Pour ceux que celà interesserait, le comportement par défaut d'une classe ContextBound est que la réentrance n'est pas autorisée. Le thread garde le verrou même en dans la cas de la sortie de contexte. Dans l'exemple ci-dessus, T1 lâche le verrou lors du WaitOne si l'attribut de synchronisation à la booléen reEntrant à true : [Synchronization(true)].