PDA

View Full Version : سوال: دریافت اطلاعات به صورت لحظه ای



یاسر مددیان
شنبه 09 بهمن 1389, 08:15 صبح
درود بر شما
توی gmail وقتی ایمیلی دریافت میشه، همون لحظه نشون میده که یک ایمیل دریافت شده.
من می خوام این و پیاده کنم که یک کاربر تو سایتم یه پیام به یه کاربر دیگه میفرسته. کاربر دیگه صفحه دریافت پیام رو باز گذاشته و منتظر دریافته. حالا همون لحظه ای که پیام ارسال میشه کاربر اونوری هم ببینه که یک پیام داره.

programmable
شنبه 09 بهمن 1389, 10:32 صبح
از قول آقای دیندار عزیز:


یک ScriptManger و یک UpdatePanel در روی فرم قرار دهید
خاصیت EnablePartialRendering از ScriptManger را برابر True قرار دهید .
خاصیت UpdaeMode از UpdatePanel را برابر Conditional قرار دهید
داخل ContentTemplate از UpdatePanel یک Lable و یک Timer قرار دهید

تا الان MarkUP صفحه aspx شما باید به شکل زیر باشد :


<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Timer ID="timer1" runat="server" />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>

حال بر روی Timer1 دابل کلید کنید و در رویداد Timer1_click اینطور بنویسید:

protected void timer1_Tick(object sender, EventArgs e)
{
RefreshTheZone();
UpdatePanel1.Update();
}

private void RefreshTheZone()
{
Label1.Text = System.DateTime.Now.ToString();
}

در واقع ما یک متد رو فراخوانی کردیم که در اون متد تاریخ جاری سیستم رو در یک Lable نمایش میده و متد Update از UpdatePanel رو فراخوانی میکنه .

برای اینکه این متد هر 5 ثانیه یکبار تکرار شود , خاصیت Interval از Timer رو برابر 5000 ست میکنیم ( 50000 میلی ثانیه ) .

تنها کاری که باقیمانده باید یک Trigger از نوع AsyncPostBackTrigger برای UpdatePanel بنویسیم :


<Triggers>
<asp:AsyncPostBackTrigger ControlID="timer1" EventName="Tick" />
</Triggers>

حال اگر صفحه را Run کنیم , مشاهده میکنیم که هر 5 ثانیه یکبار بدون PostBack تاریخ سیستم بروز میشود .

هدف ما در اینجا نحوه استفاده از از کنترلهای Timer و UpdatePanel بود وگرنه هیچ کار مفیدی نکردیم .

برای اینکه همه کد رو یکجا داشته باشید من اینجا به صورت کامل میزارم :

صفحه aspx:


<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="timer1" EventName="Tick" />
</Triggers>
<ContentTemplate>
<asp:Timer ID="timer1" runat="server" Interval="5000" ontick="timer1_Tick" />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Timer ID="Timer2" runat="server">
</asp:Timer>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>

و صفحه aspx.cs :


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Label1.Text = System.DateTime.Now.ToString();
}

protected void timer1_Tick(object sender, EventArgs e)
{
RefreshTheZone();
UpdatePanel1.Update();
}

private void RefreshTheZone()
{
Label1.Text = System.DateTime.Now.ToString();
}

یاسر مددیان
شنبه 09 بهمن 1389, 10:54 صبح
ممنون دوست عزیز.
حالا این که شما گفتین هر 5 ثانیه یک بار اطلاعات رو رفرش می کنه. من نمی خوام تو یه Timer باشه. می خوام در زمانی که کاربر اول پیام رو می فرسته و این پیام تو بانک ثبت میشه، صفحه کاربر دوم رفرش شه و بگه یه پیام اومده.

programmable
شنبه 09 بهمن 1389, 11:02 صبح
شما باید Query Notification رو پیاده سازی کنید فکر کنم یه مثال تو همین فروم قبلا ها دیده بودم جستجو کنید پیدا نکردین بگید براتون توضیح بدم.

javad.nic63
شنبه 09 بهمن 1389, 11:07 صبح
برادر عزیز دیتابیس که نمی تونه شروع کننده ارتباط با برنامه باشه. دیتابیس خودش یه سروره. شما باید با یه مکانیزمی ارتباط رو برقرار کنی. یه راهش همینه که دوستمون گفته. راه دیگش اینه که روی یه دکمه ای چیزی کلیک بشه. توی ایمیل ها من ندیدم که خودش آپدیت بشه. من اگه بخوام ببینم ایمیلی برام اومده باید روی گزینه inbox کلیک کنم که تا پیغام هام آپدیت بشه. که فکر می کنم این بهترین روشه. روش دوستمون به سرور فشار میاره.

یاسر مددیان
شنبه 09 بهمن 1389, 11:44 صبح
برادر عزیز دیتابیس که نمی تونه شروع کننده ارتباط با برنامه باشه.
من منظورم به دیتابیس نبود.


راه دیگش اینه که روی یه دکمه ای چیزی کلیک بشه. توی ایمیل ها من ندیدم که خودش آپدیت بشه. من اگه بخوام ببینم ایمیلی برام اومده باید روی گزینه inbox کلیک کنم که تا پیغام هام آپدیت بشه.
gmail خودش آپدیت میشه. حالا نمی دونم تایمر داره یا یه مکانیسم دیگه ای داره!


روش دوستمون به سرور فشار میاره.
از چه نظر به سرور فشار میاد؟ حالا اگه سرور share نباشه و خودم با ip static یه iis server راه اندازی کنم چی؟

javad.nic63
شنبه 09 بهمن 1389, 12:08 عصر
منظور از اینکه روش دوستمون به سرور فشار میاره برا وقتیه که بخوای از طریق اینترنت کار کنی هر 5 ثانیه مراجعه به سرور باعث میشه صفحه خوب کار نکنه. ولی اگه تو شبکه داخلی داری کار میکنی اگه کاربرات خیلی زیاد نباشن مشکلی پیش نمیاد

Javad.Kashi
شنبه 09 بهمن 1389, 13:13 عصر
سلام به همگی
دوستان سوال من اینه که مگه نمیشه این کار را با ajax انجام داد؟:متعجب::متعجب::متعجب:

javad.nic63
شنبه 09 بهمن 1389, 13:24 عصر
کاری که دوستمون programmable (http://barnamenevis.org/member.php?36018-programmable) گفتن دقیقاً براساس ajax هستش.