PDA

View Full Version : تداخل نخهای استفاده شده با نخهای اصلی برنامه فکر کنم



Me3ter
دوشنبه 16 اردیبهشت 1392, 22:20 عصر
سلام دوستان...

من یه برنامه دارم که چند کاربره است یه قسمتش با سوکته

وقتی یک کاربر در برنامه مثلا یک رکورد را حذف میکنه بعد از حذف، عدد 1 به یک سرور ارسال میشه که سرور 1 رو به همه کلاینتها یی که بهش وصلند میفرسته، کلاینتها هم که با یک نخ دائم در حال رسیو هستند اگر 1 دریافت کنند رکوردهارو از بانک سلکت میکنند

این سند و رسیوا همه درست انجام میشن ولی وقتی کلاینت 1 رو دریافت کرد و سلکت کرد این اررور ها پیش میاد

از این خط اررور میگره که کارش اینه وقتی کاربر یوزر پس زد اگر درست بود فرم اصلی رو باز میکنه 103794
یا انکنه این اررور رخ نمیده و همه چیز هنگام حذف درست انجام میشه ولی وقتی میخای ثبت جدید کنی برنامه هنگ میکنه، کدهای حذف و سند و رسیو رو میزارم که دوستان راحت تر راهنمایی کنند

این پروسه از لود شدن فرم، وصل شدن به سرور و رسیو



public FormAsli(string[] Roluser, string user)
{
InitializeComponent();
this.Roluser = Roluser;
this.user = user;
authenticaion(Roluser);

CheckForIllegalCrossThreadCalls = false;
binCmb();
Databind(Bilit.Select(0));



}

private void FormAsli_Load(object sender, EventArgs e)
{
mnkarbar.Text = " خوش امدید کاربر: " + user;
connect();
}

private void connect()
{
// string server = txt_IPServer.Text;
// int serverPort = int.Parse(txt_Port.Text);

try
{
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint serverEndPoint = new IPEndPoint(Dns.Resolve("127.0.0.1").AddressList[0], 9898);
sock.Connect(serverEndPoint);

MessageBox.Show("Connected to server. ");


backgroundWorker1.RunWorkerAsync();
Thread node = new Thread(new ThreadStart(StartRecive));
node.Start();
}
catch (Exception ex)
{

}
}

private void StartRecive()
{
if (sock != null)
{
while (true)
{
try
{
buffer = new byte[2024];
data = null;
len = sock.Receive(buffer);
data = Encoding.ASCII.GetString(buffer, 0, len);
if (data == "1")
{
try
{
Databind(Bilit.Select(0));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
// Exit loop if server indicates shutdown
if (len == 0)
{
sock.Close();
// break;
}
}
catch
{
}
}
}
else
{
// wl("CQQWCQWCQ");
}
}

private void send()
{
try
{
buffer = new byte[2024];
buffer = Encoding.ASCII.GetBytes("1");

sock.Send(buffer);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

اینم حذف و سند
BLL.Bilit bilit = new BLL.Bilit();
if (MessageBox.Show("خذف شود؟", "هشدار", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
int ret = bilit.Delete(Id, user);
if (ret > 0)
{
send();
// Databind(Bilit.Select(0));
}
else
MessageBox.Show("حذف با مشکل مواجه شد");
}
من که واقعا نمیدونم عیب از کجاست

Me3ter
سه شنبه 17 اردیبهشت 1392, 00:06 صبح
البته background worker غیر فعال هست

Me3ter
سه شنبه 17 اردیبهشت 1392, 08:35 صبح
دوستان کسی با این مشکل رو برو نشده ، رهنمایی کنه ؟؟؟؟

mahmoud99
سه شنبه 17 اردیبهشت 1392, 11:43 صبح
کسی نیست پاسخ بده ؟؟؟

iman3065
سه شنبه 17 اردیبهشت 1392, 13:40 عصر
من هم همچین مشکلی دارم لطفا پاسخ بدید

FastCode
سه شنبه 17 اردیبهشت 1392, 16:11 عصر
سال ۸۸ من میخواستم چنین کاری انجام بدم.تا الان دارم روش کار میکنم و آخرش به این نتیجه رسیدم که خودم یک دیتابیس بنویسم.

مشکلی که در سوال هست با عکس های داده شده حل نمیشه.کد های کلاس کاربر رو بزارید


شما بهتره که تغییرات رو serilaize کنید و مستقیم روی اطلاعاتی که در برنامتون دارید اعمال کنید.سرعت روش فعلیتون فوقالعاده کمه.
حداقل از روش های lazy استفاده کنید.
مثل Acquire late, Release Early

Xcalivorse
سه شنبه 17 اردیبهشت 1392, 18:34 عصر
دوست عزیز به جای این کار از کلاس SqlDependency استفاده کن. این کلاس مخصوص همین کار هست.

Me3ter
جمعه 27 اردیبهشت 1392, 15:31 عصر
دوست عزیز به جای این کار از کلاس SqlDependency استفاده کن. این کلاس مخصوص همین کار هست.

اقا اینم استفاده کردم گریدو هی رفرش میکنه :) در حالی که باید بعد از تراکنش رفرش کنه