باز هم رسیدیم به پاسخم در پست 1428.
تعداد Action های تعریف شده 17 تا است، از صفر پارامتری تا 16 پارامتری. با همین یک Action بدون پارامتر، 12 متد Parallel.For و 20 تا متد Parallel.ForEach و 2 تا متد Parallel.Invoke داریم که جمعا میشه 34 متد. کمه؟ حالا شما میگید چرا بجای 34 متد صرفا برای بدون پارامتر، برای حداکثر یک پارامتری 68 متد یا برای تا 16 پارامتری 578 متد رو تعریف نکردند؟
خیلی ممنون استاد .
بذارید جواب سئوال هاتون را نامنظم بدم . حس میکنم یه مسائلی این وسط قر و قاتی شد که باعث میشه منظور همدیگه را درک نکنیم .
من به اورلود متدهای Parallel کاری ندارم . تا به این لحظه ، فقط متد Parallel.Invoke را در نظر بگیرید . هر اورلودی از این متد ، فقط دلیگیت Action را میگیره .حالا من میگم که چطوره که متد سازنده ی کلاس Thread ، دلیگیت ای از نوع ParameterizedThreadStart (که یه object رو به عنوان ورودی این دلیگیت و متد میپذیره) را قرار دادن تا برنامه نویس بتونه موقع اجرای نخ جدید ، یه پارامتری به نخ جدیدش ارسال کنه اما در این متدِ Parallel.Invoke ، چرا از دلیگیت ای (دلیگیتِ Action) استفاده کردن که برنامه نویس نتونه ورودی ای براش ارسال کنه؟
همونطور که میدونید و کدی هم که در پست 1426نوشتید (اشاره به همین حرفم داره) ، وقتی که از عملگر لامبدا (بجای تعریف شی دلیگیت) در متد Parallel.Invoke استفاده کردید ، به همین متد بی نام اش هم پارامتر ندادید .
یعنی من میگم بشه یه کدی نوشت که این جوری باشه :
کد:
private void button1_Click(object sender, EventArgs e)
{
Parallel.Invoke(
(object par) =>
{
MyAction1((string)par);
}
);
}
private static void MyAction1(string message)
{
MessageBox.Show("Action 1: " + message);
}
یعنی عبارت لامبدا مون (یا کلا دلیگیت مون) ، ورودی بتونیم بهش بدیم .
الان سئوالم را قشنگ مطرح کردم؟ امید آن میرود که قشنگ ، مفهوم را رسونده باشم
خوب به نظرشون اضافی و غیر منطقی است. عملا که دیدید با همون Action بدون پارامتر بدون مشکل و زحمت هر تعداد پارامتری رو می توانیم به هر متد دلخواهی ارسال کنیم. ما که نمی خواهیم delegate اجرا کنیم، ما متد اجرا می کنیم.
شما از داخل یک متدی که آرگومانی دریافت نمیکرد (متد بینامی که به عنوان عبارت لامبدا در نظر گرفتید) ، مقدار لیترالی (رشته ی "any message") را فرستادید .من میگم خود این متد (که حالا به عنوان عبارت لامبدا تعریف کردید بتونه مقداری را دریافت کنه.
Action یک delegate ئه و Parellel برای استفاده از delegete ای به نام Action طراحی شده.
میدونم.
اگر منظور شما این باشه که delegate ای بجز Action تعریف کنیم و جایگزین Action کنیم در همون پست قبل گفتم که "نمیشه متد یک delegate رو به تعریف دیگری تحمیل کرد."، حتی اگر تعاریف مشابه هم باشند.
نه . منظورم این نیست .
کلا دو تا سئوال دارم . یکی اش را که فکر کنم در پاراگراف بالا در همین پست ، قشنگ گفته باشم دیگه . ان شاء ا... که متوجه اش شده باشید .
یکی دیگه را هم در زیر میگم.
از طرف دیگه متوجه نمیشم چرا نباید از عملگر Lambda استفاده کنید.
چون من اون روش را بهتر درک میکنم .
یعنی الان نمیشه اون کدی که در پست 1426 دادید (که در همین پست هم نوشتم) ، بجای عملگر و عبارت لامبدا ، یک دلیگیت بسازید و اون رو اجرا کنید؟
یعنی الان مثلا به روشی که در کد زیر مینویسم ، موقع اجرای متد Parallel.For (در آرگومان سوم اش) ، مقدار par (در متد ActionHandler) را چجوری براش ارسال کنیم؟ (دقت کنید که نمیخوام از عبارت و عملگر لامبدا استفاده کنم . میخوام از همین روش زیر برم) :
کد:
private void Button6_Click(object sender, EventArgs e)
{
Action<int> action = new Action<int>(this.ActionHandler);
System.Threading.Tasks.Parallel.For(0, 1000000000, action);
this.button6.Text = this.ParallelCounter.ToString();
}
private void ActionHandler(int par)
{
par++;
}
شدنی هه؟
اگه آره ، کدش چجوری میشه؟
اگه نشدنی هه ، پس چرا مثل متد Thread.Start (که مقدار ورودی parameter را در نظر گرفت تا برای دلیگیتی که در متد سازنده ی Thread میسازیم ، بفرسته) ، برای ورودی متد Parallel.For ، یک پارامتر دیگه ای تعریف نکرد (مثل پارامتر parameter در متد Thread.Start) تا اون پارامتر را برای متد دلیگیت Action (سومین پارامتر در متد Parallel.For) بفرسته؟
متوجه ی سئوالم شدین؟
هدف اجرای موازی ئه، نه نخ سازی. NET. و سیستم عامل سعی می کنه استفاده بهینه رو از منابع ببره، نخ ها هم جزو این منابع هستند. وقتی نخ اصلی بیکار باشه مانعی برای انجام عملیات روی اون نیست.
نخ نخ ئه، وقتی نخ بیکار باشه فرقی نمی کنه که نخ اصلی باشه یا نخ غیر اصلی.
مشخص کردن فرمت رشته بصورت درجا، نه مثل String.Format که پارامتر ها بعد رشته مشخص میشن. هرجا در رشته جای درج پارامتری است با {} مقدارش وارد میشه.
string interpolation (C# reference) $
خیلی ممنون