Ich bin neu die Verwendung von Task.run () < /code> zusammen mit Async und warte darauf, die Benutzeroberfläche reaktionsschnell zu machen. Wahrscheinlich habe ich etwas nicht richtig implementiert. Führen Sie den Code aus, er scheint immer noch einzufrieren (ich kann das Fenster nicht bewegen oder mit anderen Schaltflächen interagieren, bis die Funktion vollständig abgeschlossen ist. />
public ICommand SearchCommand
{
get
{
if (_SearchCommand == null)
{
_SearchCommand = AsyncCommand.Create(() => Search());
}
return _SearchCommand;
}
}
private async Task Search()
{
IEnumerable points = await SearchAsync(_CurrentPIServer, NameSearch, PointSourceSearch).ConfigureAwait(false);
SearchResults.Clear();
foreach (PIPoint point in points)
{
SearchResults.Add(point.Name);
}
}
private async Task SearchAsync(string Server, string NameSearch, string PointSourceSearch)
{
{
PIServers KnownServers = new PIServers();
PIServer server = KnownServers[Server];
server.Connect();
return await Task.Run(()=>PIPoint.FindPIPoints(server, NameSearch, PointSourceSearch)).ConfigureAwait(false);
}
}
< /code>
Ich denke, dass das [url=viewtopic.php?t=20324]Problem[/url] irgendwo darin besteht, wie ich die langlebige Funktion auf einen Thread schiebe und nicht vom UI -Thread abreißt oder wie Aufgaben und Async /wartet vollständig aus. UI -Reaktionsfähigkeit. Ich habe einen zweiten Befehl erstellt, der dieselben Aktionen ausführt, und ich erhalte in beiden Fällen die gleiche Antwort von der Benutzeroberfläche. Der Code sieht jetzt aus wie der folgende < /p>
Code: < /p>
public ICommand SearchCommand
{
get
{
if (_SearchCommand == null)
{
_SearchCommand = AsyncCommand.Create(async () =>
{
var results = await Task.Run(()=>Search(_CurrentPIServer, NameSearch, PointSourceSearch));
SearchResults = new ObservableCollection(results.Select(x => x.Name));
});
}
return _SearchCommand;
}
}
public ICommand SearchCommand2
{
get
{
if (_SearchCommand2 == null)
{
_SearchCommand2 = new RelayCommand(() =>
{
var results = Search(_CurrentPIServer, NameSearch, PointSourceSearch);
SearchResults = new ObservableCollection(results.Select(x => x.Name));
}
,()=> true);
}
return _SearchCommand2;
}
}
private IEnumerable Search(string Server, string NameSearch, string PointSourceSearch)
{
PIServers KnownServers = new PIServers();
PIServer server = KnownServers[Server];
server.Connect();
return PIPoint.FindPIPoints(server, NameSearch, PointSourceSearch);
}
< /code>
Ich muss etwas fehlen, aber ich bin mir nicht sicher, was an diesem Punkt. Durch einfaches Ändern der Rückkehr der Suche
, was die Funktion der Objekte bereits iteriert hat, ermöglicht die Benutzeroberfläche, dass die Benutzeroberfläche reaktionsschnell bleibt. Ich habe Stephens Antwort als korrekt gekennzeichnet, da sie mein Hauptproblem mit der richtigen Arbeit des UI -Threads behandelte.>
Ich bin neu die Verwendung von Task.run () < /code> zusammen mit Async und warte darauf, die Benutzeroberfläche reaktionsschnell zu machen. Wahrscheinlich habe ich etwas nicht richtig implementiert. Führen Sie den Code aus, er scheint immer noch einzufrieren (ich kann das Fenster nicht bewegen oder mit anderen Schaltflächen interagieren, bis die Funktion vollständig abgeschlossen ist. />[code] public ICommand SearchCommand { get { if (_SearchCommand == null) { _SearchCommand = AsyncCommand.Create(() => Search()); } return _SearchCommand; } } private async Task Search() { IEnumerable points = await SearchAsync(_CurrentPIServer, NameSearch, PointSourceSearch).ConfigureAwait(false); SearchResults.Clear(); foreach (PIPoint point in points) { SearchResults.Add(point.Name); } } private async Task SearchAsync(string Server, string NameSearch, string PointSourceSearch) { { PIServers KnownServers = new PIServers(); PIServer server = KnownServers[Server]; server.Connect(); return await Task.Run(()=>PIPoint.FindPIPoints(server, NameSearch, PointSourceSearch)).ConfigureAwait(false); } } < /code>
Ich denke, dass das [url=viewtopic.php?t=20324]Problem[/url] irgendwo darin besteht, wie ich die langlebige Funktion auf einen Thread schiebe und nicht vom UI -Thread abreißt oder wie Aufgaben und Async /wartet vollständig aus. UI -Reaktionsfähigkeit. Ich habe einen zweiten Befehl erstellt, der dieselben Aktionen ausführt, und ich erhalte in beiden Fällen die gleiche Antwort von der Benutzeroberfläche. Der Code sieht jetzt aus wie der folgende < /p>
Code: < /p>
public ICommand SearchCommand { get { if (_SearchCommand == null) { _SearchCommand = AsyncCommand.Create(async () => { var results = await Task.Run(()=>Search(_CurrentPIServer, NameSearch, PointSourceSearch)); SearchResults = new ObservableCollection(results.Select(x => x.Name)); }); } return _SearchCommand; } } public ICommand SearchCommand2 { get { if (_SearchCommand2 == null) { _SearchCommand2 = new RelayCommand(() => { var results = Search(_CurrentPIServer, NameSearch, PointSourceSearch); SearchResults = new ObservableCollection(results.Select(x => x.Name)); } ,()=> true); } return _SearchCommand2; } } private IEnumerable Search(string Server, string NameSearch, string PointSourceSearch) { PIServers KnownServers = new PIServers(); PIServer server = KnownServers[Server]; server.Connect(); return PIPoint.FindPIPoints(server, NameSearch, PointSourceSearch); } < /code>
Ich muss etwas fehlen, aber ich bin mir nicht sicher, was an diesem Punkt. Durch einfaches Ändern der Rückkehr der Suche [/code], was die Funktion der Objekte bereits iteriert hat, ermöglicht die Benutzeroberfläche, dass die Benutzeroberfläche reaktionsschnell bleibt. Ich habe Stephens Antwort als korrekt gekennzeichnet, da sie mein Hauptproblem mit der richtigen Arbeit des UI -Threads behandelte.>
Dies hängt in gewisser Weise mit meinem tatsächlichen Code zusammen. Die in Pytest Fixture verwendete Async-Kontextmanagerklasse gibt ein Async-Generatorobjekt anstelle der erwarteten...
Gibt es ein Tool, das C /C ++ - Quellcode aus XML (oder ähnlichem) generiert, um die Befehlszeilenargument -Parsen -Funktionalität zu erstellen? Frage: