cross threading
Jeg har en klasse ved navn sartoriusI constucteren oprettet en serielports som åbnes.
I klassen henter metoden "GetData" data.
I formen startes en system.timers.timer.
Hver gang timeren kører hentes data med klassen sartorius metode getData
Køres denne timer med for hurtigt bliver getData kaldt igen før den bliver afsluttet.
Hvad kan jeg gøre.
Lade være med at kører timeren for hurtigt kunne være et svar.
Men kunne man ikke stoppe eventuelt andre tråde, der bruger getData, så der ikke opstår cross threading?
fejlmeddelse:"The I/O operation has been aborted because of either a thread exit or an application request."
using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace Ksat
{
class Sartorius
{
SerialPort port;
string data;
public Sartorius(string portName, int baudRate, Parity parity, int dataBits)
{
port = new SerialPort(portName, baudRate, parity, dataBits);
port.Handshake = Handshake.None;
port.DtrEnable = true;
port.ReceivedBytesThreshold = 1;
if(!port.IsOpen) port.Open();
}
public string[] GetData()
{
string[] result = new string[] { "NaN", "NaN" };
string command = ((char)27).ToString() + ((char)80).ToString() + ((char)13).ToString() + ((char)10).ToString();
port.DiscardInBuffer();
port.DiscardOutBuffer();
port.Write(command);
bool found = false;
DateTime startTime = DateTime.Now;
while (!found & DateTime.Now.Subtract(startTime).TotalSeconds < 2)
{
char c = (char)port.ReadChar();
data += c.ToString();
if (c.ToString() == "\r")
{
found = true;
string tmp= data.Replace("g", "").Replace("\r", "").Replace(" ", "");
result = new string[] { tmp, data };
}
}
data = "";
return result;
}
}
}
using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace WindowsFormsApplication_test
{
public partial class Form1 : Form
{
delegate void TextboxDelegate(string text, TextBox textbox);
System.Timers.Timer aTimer;
Ksat.Sartorius sart;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
sart = new Ksat.Sartorius("COM12", 1200, Parity.Odd, 7);
aTimer = new System.Timers.Timer();
aTimer = new System.Timers.Timer(100);
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
aTimer.Start();
}
private void TxtToTextBox(string txt, TextBox textbox)
{
if (textbox.InvokeRequired)
textbox.Invoke(new TextboxDelegate(TxtToTextBox), txt, textbox);
else
{
textbox.Text = txt;
}
}
private void button1_Click(object sender, EventArgs e)
{
}
private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
string[] data = sart.GetData();
TxtToTextBox(data[0], this.textBox1);
}
}
}