WPF Async Command Blocking UIC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 WPF Async Command Blocking UI

Post by Anonymous »

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: Select all

    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.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post