PDA

View Full Version : سوال: استفاده از BackGroundWorker و مشکلات آن



fazel-d
سه شنبه 26 آذر 1387, 20:02 عصر
1 -
داخل یه برنامه سوکت _ برای اینکه سرور همیشه Listen باشد متد Receive رو داخل یه BGWorker و در داخل آن یه حلقه while قرار دادم _ و وقتی که می خواهم اطلاعات دریافتی از Client رو در TextBox موجود بر روی Server نشان دهم _ یه Error مبنی براین که از TextBox در این Thread نمی توانید استفاده کنید داد که من برای اینکه دیگه این مشکل پیش نیاد از Delegate ها استفاده کردم و اون TextBox رو Invoke کردم _ اما باز هم به من Error داد
البته این کار رو با Thread هم کردم و به همین مشکل برخوردم
همچنین متد AsynCallBack هم استفاده کردم و زمانی که Client برای اولین بار اطلاعاتشو برای Server می فرسته توی اون TextBox نشون می ده ولی برای دفعات بعدی نه ! اگرچه از یه WHile هم استفاده کردم

بنابراین ترجیح دادم که از همون BGWorker استفاده کنم .
خواهشا جوابها بر روی BGWorker باشه _ چونکه خیلی کد زدم و تغییرشون :عصبانی++:
این هم کد :

private void Form1_Load(object sender, EventArgs e)
{
bgWorkerServer.RunWorkerAsync();
//RunServer();
}
private void bgWorkerServer_DoWork(object sender, DoWorkEventArgs e)
{
RunServer();
}
private void RunServer()
{
try
{
server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

ipServer = new IPEndPoint(ipAdrServer, PortNum);
server.Bind(ipServer);
lbstatus.Text="Waiting for Client ... ";
server.Listen(100);
server = server.Accept();

IPEndPoint ipClient=(IPEndPoint)server.RemoteEndPoint;
lbstatus.Text = string.Format("{0}:{1}",ipClient.Address,ipClient.Port);

textBox txt1 = new textBox(RunServer);
if (txtReceive.InvokeRequired)
{
txtReceive.Invoke(txt1);
return;
}
while (true)
{
buffer = new byte[500];
int numRec= server.Receive(buffer, SocketFlags.None);

strBuf = Encoding.ASCII.GetString(buffer, 0, numRec);
lbstatus.Text = "Received Data From Client . ";
MessageBox.Show(strBuf);
MessageBox.Show(numRec.ToString());
txtReceive.Text = strBuf;
}
}
catch (SocketException Ex)
{
MessageBox.Show(Ex.ToString());
}
}
#endregionفکر نکنم توی کد مشکلی باشه _ چونکه من خودم با همین تعریف ها در Delegate برنامه های دیگه ای هم نوشتم.

2 -
البته یه مشکل دیگه هم هست و اون زمانی هست که از متد Bind داخل Thread که استفاده می کنم خطای زیر رو می ده

Only one usage of each Socket address .....

vcldeveloper
چهارشنبه 27 آذر 1387, 02:43 صبح
طبیعی هست. در ویندوز نباید از یک Thread به کنترل های رابط کاربری که در Thread دیگه ایی ساخته شدند، دسترسی پیدا کنید. کنترل Text شما توسط Thread اصلی Process ایجاد شده، و باید توسط همان Thread هم تغییر کنه. Worker Thread شما باید به Thread اصلی اطلاع بده که میخواد تغییری در کنترل Text بده، و Thread اصلی آن تغییر را براش انجام بده.

fazel-d
چهارشنبه 27 آذر 1387, 22:55 عصر
البته من Delegate هم تعریف کردم.