Einzelnen Beitrag anzeigen

Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: "Live-Suche" realisieren (hier: C#)

  Alt 16. Dez 2009, 18:47
Zitat von Matze:
Was ist bei dir denn "this.OnSearchCompleted"? Ist das eine Methode, die aufgerufen wird, wenn zu Ende gesucht wurde?
Genau. Ein On-Präfix kennzeichnet unter .NET eine Methode, die ein zugehöriges Event auslöst - im Zusammenhang mit Delphi natürlich etwas verwirrend . Da du die Klasse ja anscheinend unabhängig von der Form machen (wie es sich gehört ), dieser aber wahrscheinlich die Synchronisierung lieber abnehmen willst, bietet sich dieses Pattern an:
Code:
public class SearchDingens
{
    public void SearchAsync();
    public event EventHandler<YourResultEventArgs> SearchCompleted;
    //public void CancelAsync();
}
Du wirst dieses Pattern auch in vielen .NET-Klassen wie Ping finden, weshalb es einen eigenen Namen trägt: EAP, Event-based Asynchronous Pattern.

Zitat von Khabarakh:
Wieso teuer? Langsam ist es halt, wenn ich das bei jedem Buchstaben zu Ende suchen lasse.
Gut, wenn es erkennbare Auswirkungen hat, dass eine alte Anfrage unnötigerweise fertig rechnet, dann musst du in meinen Vorschlag eben doch noch ein Cancellation-Konzept einfügen. Deine Abbruchbedingung in Search wäre dann der Vergleich
Code:
token == currentToken
, da dann aber mehrere Threads auf currentToken zugreifen, solltest du synchronisieren:
Code:
object lockObj = new object();

void Search(object token)
{
    foreach (...) {
        lock (lockObj)
            if (token == currentToken)
                return;
        ...
    }
}

public void StartSearch()
{
    var token = new object();
    lock (lockObj)
        this.currentToken = token;
    ...
}
(Mal sehen, wann der erste mit einer Interlocked-Lösung kommt ...)


Edit: Die kanonische On-Methode:
Code:
void OnEventX(YourEventArgs args)
{
   EventHandler<YourEventArgs> handler = this.EventX;
   if (handler != null)
      handler(this, args);
}
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat