Der Einfachheit halber habe ich meinen Xamarin nUnit-Testfehler als Konsolenanwendung reproduziert und zeigt das gleiche Problem, das ich nicht verstehen kann. Also zuerst der Code, der funktioniert und zweitens der Code, der nicht funktioniert.I-Befehl asynchron ausführen
Einfache Konsole app
public class Working
{
private MyViewModel _viewModel;
public Working()
{
Console.WriteLine("Start");
_viewModel = new MyViewModel();
}
static void Main(string[] args)
{
Working prog = new Working();
prog.Print();
}
public void Print()
{
_viewModel.NewSurveyCommand.Execute(null);
}
}
public class MyViewModel
{
public MyViewModel()
{
NewSurveyCommand = new MyCommand(RunTest);
}
public ICommand NewSurveyCommand { get; private set; }
private void RunTest()
{
Console.WriteLine("Running...");
Thread.Sleep(1000);
Console.WriteLine("Test done");
}
}
public class MyCommand : ICommand
{
private Action _action;
public MyCommand(Action action)
{
_action = action;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_action.Invoke();
}
}
Dies funktioniert gut, die Konsole druckt läuft ... dann druckt Test in einer Sekunde. Nun ist die zweite Asynchron-Version, die nur Druck läuft ...
public class Program
{
private ViewModel _viewModel;
public Program()
{
Console.WriteLine("Start");
_viewModel = new ViewModel();
}
static void Main(string[] args)
{
Program prog = new Program();
prog.Go();
}
async void Go()
{
await Print();
}
public async Task Print()
{
await Task.Run(() => _viewModel.NewSurveyCommand.Execute(null));
}
}
public class ViewModel
{
public ViewModel()
{
NewSurveyCommand = new Command(async() => await RunTest());
}
public ICommand NewSurveyCommand { get; private set; }
public async Task RunTest()
{
Console.WriteLine("Running...");
await Task.Run(() => Thread.Sleep(1000));
Console.WriteLine("Test done");
}
}
public class Command : ICommand
{
private Action _action;
public Command(Action action)
{
_action = action;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_action.Invoke();
}
}
}
So ist der zweite Fall führt nur einen Teil des Codes, wenn es bekommt Task.Run (() => Thread.Sleep (1000)) zu erwarten ; Es bleibt nur die Methode, nie wieder zu kommen. Ich verstehe nicht warum und wie man das löst. Hat jemals jemand das gleiche Problem gefunden? Vielen Dank.
Mögliche Duplikat [Kann nicht geben Sie den ‚async‘ Modifikator auf der ‚Main‘ Methode einer Konsole app] (https://stackoverflow.com/questions/9208921/cant -specify-the-async-Modifikator-on-the-main-Methode-einer-Konsole-App) – mjwills