PDA

View Full Version : صف و پشته در سی شارپ



amin_sltny
پنج شنبه 15 فروردین 1392, 12:34 عصر
سلام بچه ها

من دارم رو یه پروژه چند ریسمانی یا Thread کار می کنم و این برنامه شبکه هم هست.

من برای هر کاربر یه نخ ایجاد کرده ام برای ارسال و دریافت حالا می خوام که اطلاعاتی که دریافت می کنه به صورت یه صف در بیایند و پرداز ش بشوند باید چه کار کنم!!؟؟

بسیار ممنونم
----------------------------------------------------------------------------------------------------------
وب سایت (http://kanonportal.ir)

tooraj_azizi_1035
پنج شنبه 15 فروردین 1392, 12:42 عصر
سلام
به نظر میرسه میخواهید از یک Collection برداشت کنید یا چیزی به اون اضافه کنید. که البته چندین Thread (به ریسمان ترجمه نکنید چون وقتی اشعار حافظ رو به انگلیسی بر می گردونیم خواننده چیزی نمی فهمه!) همزمان حذف و اضافه می کنند.
فضای نام System.Collections.Concurrent ساختمان داده هایی رو برای این کار فراهم کرده. مثلاً ConcurrentBag ویژگی unordered بودن رو داره یعنی مثل صف و پشته نیست.

متغیری از این نوع تعریف کنید و در ترد های تولید کننده داده با متد Add مقداری رو به اون اضافه کنید و با متد TryPeek اون رو بردارید. این کد در یک ترد است شما می تونید اون رو چندتردی پیاده کنید:
using System;
using System.Collections.Concurrent;

class ConcurrentBagDemo
{
// Demonstrates:
// ConcurrentBag<T>.Add()
// ConcurrentBag<T>.IsEmpty
// ConcurrentBag<T>.TryTake()
// ConcurrentBag<T>.TryPeek()
static void Main()
{
// Construct and populate the ConcurrentBag
ConcurrentBag<int> cb = new ConcurrentBag<int>();
cb.Add(1);
cb.Add(2);
cb.Add(3);

// Consume the items in the bag
int item;
while (!cb.IsEmpty)
{
if (cb.TryTake(out item))
Console.WriteLine(item);
else
Console.WriteLine("TryTake failed for non-empty bag");
}

// Bag should be empty at this point
if (cb.TryPeek(out item))
Console.WriteLine("TryPeek succeeded for empty bag!");
}

}

amin_sltny
پنج شنبه 15 فروردین 1392, 14:54 عصر
سلام
به نظر میرسه میخواهید از یک Collection برداشت کنید یا چیزی به اون اضافه کنید. که البته چندین Thread (به ریسمان ترجمه نکنید چون وقتی اشعار حافظ رو به انگلیسی بر می گردونیم خواننده چیزی نمی فهمه!) همزمان حذف و اضافه می کنند.
فضای نام System.Collections.Concurrent ساختمان داده هایی رو برای این کار فراهم کرده. مثلاً ConcurrentBag ویژگی unordered بودن رو داره یعنی مثل صف و پشته نیست.

متغیری از این نوع تعریف کنید و در ترد های تولید کننده داده با متد Add مقداری رو به اون اضافه کنید و با متد TryPeek اون رو بردارید. این کد در یک ترد است شما می تونید اون رو چندتردی پیاده کنید:
using System;
using System.Collections.Concurrent;

class ConcurrentBagDemo
{
// Demonstrates:
// ConcurrentBag<T>.Add()
// ConcurrentBag<T>.IsEmpty
// ConcurrentBag<T>.TryTake()
// ConcurrentBag<T>.TryPeek()
static void Main()
{
// Construct and populate the ConcurrentBag
ConcurrentBag<int> cb = new ConcurrentBag<int>();
cb.Add(1);
cb.Add(2);
cb.Add(3);

// Consume the items in the bag
int item;
while (!cb.IsEmpty)
{
if (cb.TryTake(out item))
Console.WriteLine(item);
else
Console.WriteLine("TryTake failed for non-empty bag");
}

// Bag should be empty at this point
if (cb.TryPeek(out item))
Console.WriteLine("TryPeek succeeded for empty bag!");
}

}


thread ها را باید چه طور کنترل کنم مثلا سایز این متغیر را 10 می ذارم اگه این ده تا ارایه پر شد نخ های دیگم برای وارد کردن با مشکل مواجه میشن؟!!