No neviem či som pochopil správne, ale mal by si si vytrvoriť event, ten by si spustil z vlákna čítača. V hlavnom vlákne by sa prihlásil na daný event a pozavolaní eventu by ten v hlavnom vlákne niečo zapísal do rtb.
ALE - dostaneš hlášku že sa pokušaš zmeniť niečo z iného vlákna v akom bolo vytvorené (cross threat detected bla bla...). Ale aj to sa dá ošetriť pomocu control invoke...
Takže, napíšeš si Event s omáčkou (v triede čítač):
Kód: Vybrať všetko
public class WriteTextEventArgs : EventArgs
{
public WriteTextEventArgs(string _text)
{
Text = _text;
}
public string Text { get; }
}
public delegate void WriteTextHandler(object sender, WriteTextEventArgs e);
public event WriteTextHandler WriteTextHandlerEvent;
protected void CallWriteTextEvent(WriteTextEventArgs e)
{
if (WriteTextHandlerEvent != null) WriteTextHandlerEvent(this, e);
}
vo vlákne čítača event zavoláš:
Kód: Vybrať všetko
...
WriteTextEventArgs ev = new WriteTextEventArgs("Text na vypisanie...");
CallWriteTextEvent(ev);
...
v hlavnom vlákne sa potom prihlásiš delegáta k triede u teba je to čítač, u mňa je to trieda lProc (inštancia z processingClass)...
vytvoríš funkciu ktorá sa bude volať:
Kód: Vybrať všetko
private void TextWriteEvent(object sender, ProcesingClass.WriteTextEventArgs e)
{
throw new NotImplementedException();
}
a do nej doplníš výpis do RTB, + trieda na ošetrnie výnimky ktorú som spomínal... u mňa je to bt_jobDel, u teba to bude nejaký richTextBox...
Kód: Vybrať všetko
private void TextWriteEvent(object sender, ProcesingClass.WriteTextEventArgs e)
{
FormControlHelper.ControlInvike(bt_jobDel, () => bt_jobDel.Text = e.Text);
}
a pomocná funkcia pre to križovanie vlákien:
Kód: Vybrať všetko
public class FormControlHelper
{
delegate void UniversalVoidDelegate();
/// <summary>
/// Call form controll action from different thread
/// </summary>
public static void ControlInvike(Control control, System.Action function)
{
if (control.IsDisposed || control.Disposing)
return;
if (control.InvokeRequired)
{
control.Invoke(new UniversalVoidDelegate(() => ControlInvike(control, function)));
return;
}
function();
}
}
Takéto riešenie používam ja... a pijem pivo