public static void AppendLog(this RichTextBox rtxt, string s) { rtxt.UIThread(() => { rtxt.AppendText($"{s}{Environment.NewLine}"); rtxt.SelectionLength = 0; if (rtxt.Lines.Length > 10000) { rtxt.Lines = rtxt.Lines.Skip(5000).ToArray(); } rtxt.SelectionStart = rtxt.TextLength; rtxt.ScrollToCaret(); }); }The above snippet of code requires the following to function correctly.
static public void UIThread(this Control control, Action code) { if (control.InvokeRequired) { control.BeginInvoke(code); return; } code.Invoke(); }I can't take credit, found it years ago on some forum somewhere. But here it is anyway. It makes a call to a winforms control synschronize with the GUI thread so that no cross-threading exceptions is thrown. GUI items can only be modified from the GUI thread and this ensures just that.
The exception thrown if correct thread synchronization is not used is:
System.InvalidOperationException was unhandled HResult=-2146233079 Message=Cross-thread operation not valid: Control 'rtxtOutput' accessed from a thread other than the thread it was created on. Source=System.Windows.Forms StackTrace: at System.Windows.Forms.Control.get_Handle() at System.Windows.Forms.TextBoxBase.GetSelectionStartAndLength(Int32& start, Int32& length) at System.Windows.Forms.TextBoxBase.set_SelectionLength(Int32 value) at System.Windows.Forms.RichTextBox.set_SelectionLength(Int32 value) at ave.dev.winform.Form1.ticker_Tick(Object sender, EventArgs e) in C:\tfs\YYY\Form1.cs:line 54 at ave.dev.winform.Form1._loggerHook_NewLogLine(String s) in C:\tfs\YYY\Form1.cs:line 38
Back to extensions list
No comments:
Post a Comment