PDA

View Full Version : حرفه ای: مفهوم يك تكه كد



m110_110
سه شنبه 04 مهر 1391, 10:08 صبح
با سلام
يك قسمتي از يك برنامه هست كه هر چي سعي مي كنم نمي فهمم كه دقيقا دارد چكار مي كند منظورم اينه كه اصلا چه جوري كار مي كنه
ممنون مي شم كسي كمي توضيح بدهد

public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment();

ChatServer.CheckForMessagesAsync(msgs =>
{
AsyncManager.Parameters["response"] = new ChatResponse
{
messages = msgs
};
AsyncManager.OutstandingOperations.Decrement();
});
}

كه تابع زير رو فراخوني مي كنه:
public static void CheckForMessagesAsync(Action<List<MessageInfo>> onMessages)
{
var queued = ThreadPool.QueueUserWorkItem(new WaitCallback(parm =>
{
var msgs = new List<MessageInfo>();
var wait = new AutoResetEvent(false);
using (var subscriber = _messages.Subscribe(msg =>
{
msgs.Add(msg);
wait.Set();
}))
{
// Wait for the max seconds for a new msg
wait.WaitOne(TimeSpan.FromSeconds(MaxWaitSeconds)) ;
}

((Action<List<MessageInfo>>)parm)(msgs);
}), onMessages);

if (!queued)
onMessages(new List<MessageInfo>());
}

m110_110
پنج شنبه 06 مهر 1391, 08:03 صبح
سلام
عجب بخش فعالي!
كسي نيست يه كم كمك كنه؟

m110_110
سه شنبه 25 مهر 1391, 09:46 صبح
سلام
دو سه هفته گذشت
كسي نمي تونه كمكم كنه
خيلي ضروري شده
ممنون

mo.esmp
پنج شنبه 27 مهر 1391, 02:50 صبح
هسته asp.net شامل مخزنی از نخهای دات نت (pool of .NET threads) هست (اگه اینجوری ترجمه کنیم) که برای پردازش درخاستهای کاربران استفاده میشه کە این مخزن worker thread pool نامیده میشه و نخها worker thread نامیده میشوند. وقتی که درخاستی بە سرور ارسال میشه worker thread pool این درخاست رو به یک worker thread میده تا اون رو انجام بده. worker thread pool کارش رو در زمانهایی که درخاستها در زمان کوتاهی انجام بگیرند به خوبی انجام میده ولی زمانی که اگه انجام یک درخاست زمانبرباشه مسل انجام عملیاتهای I/O یا دریافت اتلاعات از یک سرور دیگه، پردازشهای دیگه معلق میمونن تا این درخاست انجام بگیره. برای افزایش کارایی در چنین حالتی پردازش غیرهمزمان در asp.net در نزر گرفته شده. با ایجاد یک Asynchronous Controller میشه درخاستها رو به سورت غیرهمزمان اجرا کرد.برای ایجاد یک Asynchronous Action در داخل controller از یک جفت <Action<Async و <Action<Completed استفاده میشه. در داخل <Action<Async کاری که باید بسورت پردازش موازی انجام بگیرە تعریف و شروع میشه و <Action<Async همیشه نوع void رو برمیگردونه و هر اتلاعاتی بسورت پارامتر به AsyncManager ارسال بشه بعد از اتمام عملیات ایم اتلاعات به <Action<Completed فرستاده میشه. زمانی که پردازش اتلاعات کامل شد <Action<Completed فراخوانی مشه تا اتلاعات رو به سمت کاربر برگردونه.

public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment();

ChatServer.CheckForMessagesAsync(msgs =>
{
AsyncManager.Parameters["response"] = new ChatResponse
{
messages = msgs
};
AsyncManager.OutstandingOperations.Decrement();
});
}
با فراخوانی AsyncManager.OutstandingOperations.Increment اعلام میکنیم که میخایم یک پردازش موازی رو آغاز کنیم. بعد از این دستور عملیاتی که باید بسورت پردازش موازی انجام بگیره رو میاریم که در اینجا یک تابع برای چک کردن دریافت پیامهای جدید فراخونی شده و در انتها با اتمام انجام عملیات چک کردن برای پیام جدید با ای دستور AsyncManager.OutstandingOperations.Decrement اعلام میکنیم که کار پردازش تمام شده و باید اکشن IndexCompleted فراخانی بشه تا اتلاعات رو به سمت کاربر بفرسته.

public ActionResult IndexCompleted(ChatResponse response)
{
return Json(response);
}

m110_110
یک شنبه 30 مهر 1391, 07:42 صبح
سلام
ممنونم از پاسختون
اين قسمت كد رو مي خواستم براي چت به كار ببرم اما هر كاري كردم نتونستم
ببينيد من نمي خواستم مثلا هر چند ثانيه يك درخواست به سرور داده بشه تا ببينه چيز جديدي هست يا خير كه در اين رابطه با جستجو به راهكارهايي رسيدم اما همگي در دمو كار ميكردن اما نمي تونستم براي خودم استفاده كنم
اين مورد اخر بسيار جالب بود ولي وقتي كد رو جدا كردم و در پروژه خودم به كار بستم باز همزماني رو نتونستم استفاده كنم و همه درخواست ها تا وقتي كه اين پردازش غير همزمان تمام نشود انها جواب داده نمي شوند
ممنون ميشم كمي كمكم كنيد
باتشكر

mobasherian
جمعه 17 آذر 1391, 13:40 عصر
اگه پروژت وب هستش , برای کنترل مقداری که کاربر چیزی وارد کرده یا نه از جاوا اسکریپت استفاده کن !!!
پردازش به حداقل می رسه !!!