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
, 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);
}