Hallo Community,
wieder mal ein Anfänger mit "vermutlich" banalen Fragen.
Leider komme ich nicht weiter und mit der Suchfunktion bin ich zwar auf den richtigen Post gekommen, aber eine Lösung habe ich immer noch nicht.
Also folgendes Problem:
Über WPF erstelle ich gerade eine Anwendung mit der ich simultan auf Android geräte zugreifen kann und beispielsweise Apps installieren kann oder Aufgaben erledige kann. Aktuell teste ich das an Emulatoren. Das funktioniert auch soweit ganz gut, aber leider werden die Aufgaben nicht gleichzeitig ausgeführt sobald ich mit einer checkbox arbeite, bekomme ich eine Fehlermeldung das auf den gleichen Thread zugegriffen wird.
Vielleicht habt ihr ja ein Tipp oder sogar eine Lösung ich hocke hier schon seit 3 tagen verzweifelt dran und komme nicht weiter.
Im Forum habe ich dazu folgendes gefunden, was vermutlich auch mein Problem löst
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
Und da ich gerne in der Gui die Möglichkeit haben möchte auszuwählen was installiert oder welche Aufgaben erledigt werden sollen wird und was nicht wäre es schade wenn ich die Checkboxen nicht nutzen könnte .
private void Button_Click(object sender, RoutedEventArgs e)
{
Task t = new Task(() => {
isStop = false;
Auto();
});
t.Start();
}
bool isStop = false;
void Auto()
{
List<string> devices = new List<string>();
devices = KAutoHelper.ADBHelper.GetDevices();
foreach (var deviceID in devices)
{
Task t = new Task(() => {
while (true)
{
if (isStop)
return;
if (Mailboxbt.IsChecked == true) // Hier kommt der Fehler mit dem selben Thread
KAutoHelper.ADBHelper.TapByPercent(deviceID, 10.3, 8.3); // bsp Tap auf eine Anwendung am Smartphone/Android
}
});
t.Start();
}
}
void Delay(int delay)
{
while (delay > 0)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
delay--;
if (isStop)
break;
}
}
Arbeite bei WPF ausschließlich mit dem MVVM Pattern, ansonsten wirst Du von Workaround zu Workaround stolpern. WPF ist so konzipiert, dass MVVM verwendet wird. Man sieht an deinem Code, dass du das aktuell nicht tust. Also löschen und neu richtig machen, dann gibt’s auch deine Folgeprobleme nicht mehr.
WPF kümmert sich in 99,99% der Fälle völlig automatisiert um das Thread Handling, wenn Du MVVM sauber durchziehst.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo und vielen Dank für dein Beitrag, da ich mit MVVM noch keine Erfahrung gemacht habe. Ist das jetzt für mich neu.
Aber jetzt weiß wenigstens wo ich ansetzen kann und werde mich erstmal einlesen
Vielen Dank nochmal !
Schau mal in [Artikel] MVVM und DataBinding.
Jedoch verstehe ich nicht, warum du bisher in deinem Code je Device eine eigene Task gestartet hast?
Außerdem hast du bisher eine 100% Prozessor-/Kernlast-Endlosschleife.
PS: Bei
List<string> devices = new List<string>();
devices = KAutoHelper.ADBHelper.GetDevices();
ist die Initialisierung in der ersten Zeile unnötig, da sie sowieso sofort wieder neu zugewiesen wird, also folgendes reicht:
List<string> devices = KAutoHelper.ADBHelper.GetDevices();