Le code que je veux écrire est comme ceci:Y at-il une bonne méthode en C# pour lancer une exception sur un fil donné
void MethodOnThreadA()
{
for (;;)
{
// Do stuff
if (ErrorConditionMet)
ThrowOnThread(threadB, new MyException(...));
}
}
void MethodOnThreadB()
{
try
{
for (;;)
{
// Do stuff
}
}
catch (MyException ex)
{
// Do the right thing for this exception.
}
}
Je sais que je peux avoir le thread B vérifier périodiquement, en fil de manière sûre , pour voir si un drapeau a été défini par thread A, mais cela complique le code. Y a-t-il un meilleur mécanisme que je peux utiliser?
Voici une plus étoffée par exemple de vérifier périodiquement:
Dictionary<Thread, Exception> exceptionDictionary = new Dictionary<Thread, Exception>();
void ThrowOnThread(Thread thread, Exception ex)
{
// the exception passed in is going to be handed off to another thread,
// so it needs to be thread safe.
lock (exceptionDictionary)
{
exceptionDictionary[thread] = ex;
}
}
void ExceptionCheck()
{
lock (exceptionDictionary)
{
Exception ex;
if (exceptionDictionary.TryGetValue(Thread.CurrentThread, out ex))
throw ex;
}
}
void MethodOnThreadA()
{
for (;;)
{
// Do stuff
if (ErrorConditionMet)
ThrowOnThread(threadB, new MyException(...));
}
}
void MethodOnThreadB()
{
try
{
for (;;)
{
// Do stuff
ExceptionCheck();
}
}
catch (MyException ex)
{
// Do the right thing for this exception.
}
}
Oh wow, si cela était possible, vous devriez vous attendre, il est possible de voir à même un simple ajout d'une exception levée. – Dykam