


C# WinForm Multithread-Entwicklung (2) ThreadPool und Timer
Ursprüngliche Adresse: Klicken Sie hier, um den Link zu öffnen
[Zusammenfassung]Dieser Artikel stellt C# vor ThreadPool und Timer für die WinForm-Multithread-Entwicklung sowie detaillierter Beispielcode werden als Referenz bereitgestellt.
Dieser Artikel setzt das oben Gesagte fort und bespricht weiterhin Multithreading-Probleme in WinForm, wobei der Schwerpunkt erneut auf Threadpool und Timer liegt.
1. ThreadPool (ThreadPool) ist eine relativ einfache Methode. Sie eignet sich für kurze Aufgaben, die mehrere Threads erfordern (z. B. einige, die häufig blockiert werden). Der Nachteil besteht darin, dass es weder den erstellten Thread steuern noch seine Priorität festlegen kann. Da jeder Prozess nur einen Thread-Pool hat und natürlich jede Anwendungsdomäne nur einen Thread-Pool (Zeile) hat, werden Sie feststellen, dass die Mitgliedsfunktionen der ThreadPool-Klasse alle statisch sind! Wenn Sie ThreadPool.QueueUserWorkItem, ThreadPool.RegisterWaitForSingleObject usw. zum ersten Mal aufrufen, wird eine Thread-Pool-Instanz erstellt. Lassen Sie mich die beiden Funktionen im Thread-Pool vorstellen:
public static bool QueueUserWorkItem( //调用成功则返回true WaitCallback callBack,//要创建的线程调用的委托 object state //传递给委托的参数 )//它的另一个重载函数类似,只是委托不带参数而已
public static RegisteredWaitHandle RegisterWaitForSingleObject( WaitHandle waitObject,// 要注册的 WaitHandle WaitOrTimerCallback callBack,// 线程调用的委托 object state,//传递给委托的参数 int TimeOut,//超时,单位为毫秒, bool executeOnlyOnce //是否只执行一次 ); public delegate void WaitOrTimerCallback( object state,//也即传递给委托的参数 bool timedOut//true表示由于超时调用,反之则因为waitObject );
Die Funktion dieser Funktion besteht darin, einen wartenden Thread zu erstellen Die Funktion wird aufgerufen. Dieser Thread wird erstellt und befindet sich in einem „blockierten“ Zustand, bis der Parameter waitObject in den beendeten Zustand wechselt oder die festgelegte Zeit TimeOut erreicht. Es ist erwähnenswert, dass sich dieser „blockierte“ Zustand stark vom WaitSleepJoin-Status des Threads unterscheidet: Wenn sich ein Thread im WaitSleepJoin-Status befindet, wird er regelmäßig von der CPU aktiviert, um die Statusinformationen abzufragen und erneut in den WaitSleepJoin-Status zu wechseln. Der mit dieser Funktion erstellte Thread ist jedoch sehr ressourcenintensiv. Bevor die Ausführung ausgelöst wird, wechselt die CPU nicht zu diesem Thread. Dies nimmt weder CPU-Zeit in Anspruch, noch verschwendet es Zeit für den Thread-Wechsel. Aber woher weiß die CPU, wann sie ausgeführt werden muss? Tatsächlich generiert der Thread-Pool einige Hilfsthreads, um diese Auslösebedingungen zu überwachen. Sobald die Bedingungen erfüllt sind, nehmen diese Hilfsthreads selbst natürlich auch Zeit in Anspruch, aber wenn Sie mehr Wartezeiten benötigen Threads, verwenden Sie den Thread-Pool. Die Vorteile werden deutlicher.
Detailliertere Demo:
namespace TestMethodInvoker { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //ThreadPool.RegisterWaitForSingleObject( // ev, // new WaitOrTimerCallback(WaitThreadFunc), // 4, // 2000, // false//表示每次完成等待操作后都重置计时器,直到注销等待 // ); ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFunc), "test1"); //Thread.Sleep(10000); } private delegate void MyInvokeDelegate(string name); private void Test(object o) { richTextBox1.Text += string.Format("the object is {0} \n", o); } public void ThreadFunc(object b) { this.Invoke(new MyInvokeDelegate(Test), b); } public void WaitThreadFunc(object b, bool t) { richTextBox1.Text += string.Format("the object is {0},t is {1}\n", b, t); } } }
它适用于需周期性调用的方法,它不在创建计时器的线程中运行,它在由系统自动分配的单独线程中运行。这和Win32中的SetTimer方法类似。它的构造为: 如果 dueTime 为0,则 callback 立即执行它的首次调用。如果 dueTime 为 Infinite,则 callback 不调用它的方法。计时器被禁用,但使用 Change 方法可以重新启用它。如果 period 为0或 Infinite,并且 dueTime 不为 Infinite,则 callback 调用它的方法一次。计时器的定期行为被禁用,但使用 Change 方法可以重新启用它。如果 period 为零 (0) 或 Infinite,并且 dueTime 不为 Infinite,则
callback 调用它的方法一次。计时器的定期行为被禁用,但使用 Change 方法可以重新启用它。 在创建计时器之后若想改变它的period和dueTime,我们可以通过调用Timer的Change方法来改变: 显然所改变的两个参数对应于Timer中的两参数。 以上就是C# WinForm多线程开发(二) ThreadPool 与 Timer的内容,更多相关内容请关注PHP中文网(www.php.cn)!this.Invoke(new Action<string>(this.ChangeText), o.ToString());
this.Invoke(new Action(delegate() { this.textBox1.Text = o.ToString();}));
private void DoSomething(object o)
{
System.Func<string, int> f = new Func<string, int>(this.GetId);
object result = this.Invoke(f, o.ToString());
MessageBox.Show(result.ToString());
}
private int GetId(string name)
{
this.textBox1.Text = name;
if (name == "Y")
{
return 999;
}
else
{
return 0;
}
}
二、 Timer
public Timer(
TimerCallback callback,//所需调用的方法
object state,//传递给callback的参数
int dueTime,//多久后开始调用callback
int period//调用此方法的时间间隔
);//
public bool Change(
int dueTime,
int period
);//

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Leitfaden zu Active Directory mit C#. Hier besprechen wir die Einführung und die Funktionsweise von Active Directory in C# sowie die Syntax und das Beispiel.

Leitfaden zum Zufallszahlengenerator in C#. Hier besprechen wir die Funktionsweise des Zufallszahlengenerators, das Konzept von Pseudozufallszahlen und sicheren Zahlen.

Leitfaden zur C#-Datenrasteransicht. Hier diskutieren wir die Beispiele, wie eine Datenrasteransicht aus der SQL-Datenbank oder einer Excel-Datei geladen und exportiert werden kann.

Leitfaden zur Fakultät in C#. Hier diskutieren wir die Einführung in die Fakultät in C# zusammen mit verschiedenen Beispielen und Code-Implementierungen.

Der Unterschied zwischen Multithreading und Asynchron besteht darin, dass Multithreading gleichzeitig mehrere Threads ausführt, während asynchron Operationen ausführt, ohne den aktuellen Thread zu blockieren. Multithreading wird für rechenintensive Aufgaben verwendet, während asynchron für die Benutzerinteraktion verwendet wird. Der Vorteil des Multi-Threading besteht darin, die Rechenleistung zu verbessern, während der Vorteil von Asynchron nicht darin besteht, UI-Threads zu blockieren. Die Auswahl von Multithreading oder Asynchron ist von der Art der Aufgabe abhängt: Berechnungsintensive Aufgaben verwenden Multithreading, Aufgaben, die mit externen Ressourcen interagieren und die UI-Reaktionsfähigkeit asynchron verwenden müssen.

Leitfaden zu Mustern in C#. Hier besprechen wir die Einführung und die drei wichtigsten Arten von Mustern in C# zusammen mit ihren Beispielen und der Code-Implementierung.

Leitfaden zu Primzahlen in C#. Hier besprechen wir die Einführung und Beispiele von Primzahlen in C# sowie die Codeimplementierung.

Es gibt verschiedene Möglichkeiten, XML -Formate zu ändern: manuell mit einem Texteditor wie Notepad bearbeiten; automatisch Formatierung mit Online- oder Desktop -XML -Formatierungswerkzeugen wie XMLBeautifier; Definieren Sie Conversion -Regeln mithilfe von XML -Conversion -Tools wie XSLT; oder analysieren und mit Verwendung von Programmiersprachen wie Python arbeiten. Seien Sie vorsichtig, wenn Sie die Originaldateien ändern und sichern.
