Je pense que j'ai trouvé une situation où RescueAttribute est cassé. Ou peut-être que j'utilise des co-routines incorrectement.C# et Caliburn - RescueAttribute et Coroutines
J'ai un ViewModel comme ceci:
[Rescue("Rescue")]
class MyViewModel
{
//... left out some bus-logic code here ...
public void Login()
{
yield return Show.Busy();
//the following line will also cause the problem, just like AsyncResult
//yield return Show.MessageBox("Test");
yield return new AsyncResult(() => _server.Login());
//throw new Exception("Aww, snap!");
yield return Show.NotBusy();
}
public void Rescue(Exception exc)
{
//Show a messagebox or something
}
}
AsyncResult est mis en œuvre comme ceci:
using Exec = Caliburn.PresentationFramework.Invocation.Execute;
public class AsyncResult : IResult
{
private readonly Action _function;
public AsyncResult(Action function)
{
_function = function;
}
public void Execute(ResultExecutionContext context)
{
Exec.OnBackgroundThread(delegate
{
try
{
_function();
}
catch (Exception exc)
{
Exec.OnUIThread(() => Completed(this, new ResultCompletionEventArgs { Error = exc, WasCancelled = true }));
return;
}
Exec.OnUIThread(() => Completed(this, new ResultCompletionEventArgs()));
});
}
public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
}
Si je décommenter l'exception dans mon ViewModel ci-dessus, le sauvetage ne parvient pas à gérer l'exception.
Est-ce un bug dans Caliburn, ou AsyncResult est-il mal implémenté?
Si vous mettez une exception avant le rendement pour retourner un AsyncResult, Rescue fonctionne très bien. Aussi si l'exception est levée sur le thread asynchrone, le sauvetage fonctionne toujours!
EDIT: vous pouvez également utiliser Show.MessageBox au lieu de AsyncResult pour reproduire le même problème.
Merci. Il nous a fallu un certain temps pour suivre cela jusqu'à l'endroit où je pourrais faire un exemple facile à reproduire. – jonathanpeppers