Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
c# ²¢ÐмÆË㣨´óÁ¿Ñ­»·´¦ÀíµÄ³¡¾°Ï£©
 
×÷Õߣº jett010
  5156  次浏览      29
 2020-11-17 
 
±à¼­ÍƼö:

±¾ÎÄÖ÷Òª½éÉÜÁ˲¢ÐмÆËãµÄ¼òµ¥Ê¹Ó㬲¢ÐÐÑ­»·µÄÖжϺÍÌø³ö¡¢²¢ÐÐÑ­»·ÖÐΪÊý×é/¼¯ºÏÌí¼ÓÏî¡¢·µ»Ø¼¯ºÏÔËËã½á¹û/º¬Óоֲ¿±äÁ¿µÄ²¢ÐÐÑ­»·¡¢¡¢PLinq£¨LinqµÄ²¢ÐмÆË㣩µÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûAnna±à¼­ÍƼö

²¢ÐмÆË㲿·Ö

ÑØÓÃ΢ÈíµÄд·¨£¬System.Threading.Tasks.::.ParallelÀ࣬Ìṩ¶Ô²¢ÐÐÑ­»·ºÍÇøÓòµÄÖ§³Ö¡£ ÎÒÃÇ»áÓõ½µÄ·½·¨ÓÐFor£¬ForEach£¬Invoke¡£

Ò»¡¢¼òµ¥Ê¹ÓÃ

Ê×ÏÈÎÒÃdzõʼ»¯Ò»¸öListÓÃÓÚÑ­»·£¬ÕâÀïÎÒÃÇÑ­»·10´Î¡££¨ºóÃæµÄ´úÂë¶¼»á°´Õâ¸ö±ê×¼½øÐÐÑ­»·£©

Program.Data = new List<int>();
for (int i = 0; i < 10; i++)
{
Data.Add(i);
}

ÏÂÃæÎÒÃǶ¨Òå4¸ö·½·¨£¬·Ö±ðΪfor£¬foreach£¬²¢ÐÐFor£¬²¢ÐÐForEach¡£²¢²âÊÔËûÃǵÄÔËÐÐʱ³¤¡£

/// <summary>
/// ÊÇ·ñÏÔʾִÐйý³Ì
/// </summary>
public bool ShowProcessExecution = false;
/// <summary>
/// ÕâÊÇÆÕͨѭ»·for
/// </summary>
private void Demo1()
{
List<int> data = Program.Data;
DateTime dt1 = DateTime.Now;
for (int i = 0; i < data.Count; i++)
{
Thread.Sleep(500);
if (ShowProcessExecution)
Console.WriteLine(data[i]);
}
DateTime dt2 = DateTime.Now;
Console.WriteLine("ÆÕͨѭ»·ForÔËÐÐʱ³¤£º{0}ºÁÃë¡£", (dt2 - dt1).TotalMilliseconds);
}
/// <summary>
/// ÕâÊÇÆÕͨѭ»·foreach
/// </summary>
private void Demo2()
{
List<int> data = Program.Data;
DateTime dt1 = DateTime.Now;
foreach (var i in data)
{
Thread.Sleep(500);
if (ShowProcessExecution)
Console.WriteLine(i);
}
DateTime dt2 = DateTime.Now;
Console.WriteLine("ÆÕͨѭ»·ForÔËÐÐʱ³¤£º{0}ºÁÃë¡£", (dt2 - dt1).TotalMilliseconds);
}
/// <summary>
/// ÕâÊDz¢ÐмÆËãFor
/// </summary>
private void Demo3()
{
List<int> data = Program.Data;
DateTime dt1 = DateTime.Now;
Parallel.For(0, data.Count, (i) =>
{
Thread.Sleep(500);
if (ShowProcessExecution)
Console.WriteLine(data[i]);
});
DateTime dt2 = DateTime.Now;
Console.WriteLine("²¢ÐÐÔËËãForÔËÐÐʱ³¤£º{0}ºÁÃë¡£", (dt2 - dt1).TotalMilliseconds);
}
/// <summary>
/// ÕâÊDz¢ÐмÆËãForEach
/// </summary>
private void Demo4()
{
List<int> data = Program.Data;
DateTime dt1 = DateTime.Now;
Parallel.ForEach(data, (i) =>
{
Thread.Sleep(500);
if (ShowProcessExecution)
Console.WriteLine(i);
});
DateTime dt2 = DateTime.Now;
Console.WriteLine("²¢ÐÐÔËËãForEachÔËÐÐʱ³¤£º{0}ºÁÃë¡£", (dt2 - dt1).TotalMilliseconds);
}

ÏÂÃæÊÇÔËÐнá¹û£º

ÕâÀïÎÒÃÇ¿ÉÒÔ¿´³ö²¢ÐÐÑ­»·ÔÚÖ´ÐÐЧÂÊÉϵÄÓÅÊÆÁË¡£

½áÂÛ1£ºÔÚ¶ÔÒ»¸öÊý×éÄÚµÄÿһ¸öÏî×öµ¥¶À´¦Àíʱ£¬ÍêÈ«¿ÉÒÔÑ¡Ôñ²¢ÐÐÑ­»·µÄ·½Ê½À´ÌáÉýÖ´ÐÐЧÂÊ¡£

Ô­Àí1£º²¢ÐмÆËãµÄÏ߳̿ªÆôÊÇ»º²½¿ªÆôµÄ£¬Ïß³ÌÊýÁ¿1,2,4,8»º²½ÌáÉý¡££¨²»Ï꣬PLinq×î¶à64¸öỊ̈߳¬¿ÉÄÜÕâÒ²ÊÇ64£©

¶þ¡¢ ²¢ÐÐÑ­»·µÄÖжϺÍÌø³ö

µ±ÔÚ½øÐÐÑ­»·Ê±£¬Å¼¶û»áÐèÒªÖжÏÑ­»·»òÌø³öÑ­»·¡£ÏÂÃæÊÇÁ½ÖÖÌø³öÑ­»·µÄ·½·¨StopºÍBreak£¬LoopStateÊÇÑ­»·×´Ì¬µÄ²ÎÊý¡£

/// <summary>
/// ÖжÏStop
/// </summary>
private void Demo5()
{
List<int> data = Program.Data;
Parallel.For(0, data.Count, (i, LoopState) =>
{
if (data[i] > 5)
LoopState.Stop();
Thread.Sleep(500);
Console.WriteLine(data[i]);
});
Console.WriteLine("StopÖ´ÐнáÊø¡£");
}
/// <summary>
/// ÖжÏBreak
/// </summary>
private void Demo6()
{
List<int> data = Program.Data;
Parallel.ForEach(data, (i, LoopState) =>
{
if (i > 5)
LoopState.Break();
Thread.Sleep(500);
Console.WriteLine(i);
});
Console.WriteLine("BreakÖ´ÐнáÊø¡£");
}

Ö´Ðнá¹ûÈçÏ£º

½áÂÛ2£ºÊ¹ÓÃStop»áÁ¢¼´Í£Ö¹Ñ­»·£¬Ê¹ÓÃBreak»áÖ´ÐÐÍê±ÏËùÓзûºÏÌõ¼þµÄÏî¡£

Èý¡¢²¢ÐÐÑ­»·ÖÐΪÊý×é/¼¯ºÏÌí¼ÓÏî

ÉÏÃæµÄÓ¦Óó¡¾°Æäʵ²¢²»ÊǷdz£¶à¼û£¬±Ï¾¹Ö»ÊÇΪÁ˱éÀúÒ»¸öÊý×éÄÚµÄ×ÊÔ´£¬ÎÒÃǸü¶àµÄʱºòÊÇΪÁ˱éÀú×ÊÔ´£¬ÕÒµ½ÎÒÃÇËùÐèÒªµÄ¡£ÄÇôÇë¼ÌÐø¿´¡£

ÏÂÃæÊÇÎÒÃÇÒ»°ã»áÏëµ½µÄд·¨£º

private void Demo7()
{
List<int> data = new List<int>();
Parallel.For(0, Program.Data.Count, (i) =>
{
if (Program.Data[i] % 2 == 0)
data.Add(Program.Data[i]);
});
Console.WriteLine("Ö´ÐÐÍê³ÉFor.");
}
private void Demo8()
{
List<int> data = new List<int>();
Parallel.ForEach(Program.Data, (i) =>
{
if (Program.Data[i] % 2 == 0)
data.Add(Program.Data[i]);
});
Console.WriteLine("Ö´ÐÐÍê³ÉForEach.");
}

¿´ÆðÀ´Ó¦¸ÃÊÇûÓÐÎÊÌâµÄ£¬µ«ÊÇÎÒÃǶà´ÎÔËÐкó»á·¢ÏÖ£¬Å¼¶û»á³öÏÖ´íÎóÈçÏ£º

ÕâÊÇÒòΪListÊÇ·ÇḬ̈߳²È«µÄÀ࣬ÎÒÃÇÐèҪʹÓÃSystem.Collections.ConcurrentÃüÃû¿Õ¼äϵÄÀàÐÍÀ´ÓÃÓÚ²¢ÐÐÑ­»·ÌåÄÚ¡£

ÄÇôÎÒÃÇÉÏÃæµÄ´úÂë¿ÉÒÔÐÞ¸ÄΪ£¬¼ÓÁËÁËConcurrentQueueºÍConcurrentStackµÄ×î»ù±¾µÄ²Ù×÷¡£

/// <summary>
/// ²¢ÐÐÑ­»·²Ù×÷¼¯ºÏÀà,¼¯ºÏÄÚֻȡ5¸ö¶ÔÏó
/// </summary>
private void Demo7()
{
ConcurrentQueue<int> data = new ConcurrentQueue<int>();
Parallel.For(0, Program.Data.Count, (i) =>
{
if (Program.Data[i] % 2 == 0)
data.Enqueue(Program.Data[i]);//½«¶ÔÏó¼ÓÈëµ½¶ÓÁÐĩβ
});
int R;
while (data.TryDequeue(out R))//·µ»Ø¶ÓÁÐÖпªÊ¼´¦µÄ¶ÔÏó
{
Console.WriteLine(R);
}
Console.WriteLine("Ö´ÐÐÍê³ÉFor.");
}
/// <summary>
/// ²¢ÐÐÑ­»·²Ù×÷¼¯ºÏÀà
/// </summary>
private void Demo8()
{
ConcurrentStack<int> data = new ConcurrentStack<int>();
Parallel.ForEach(Program.Data, (i) =>
{
if (Program.Data[i] % 2 == 0)
data.Push(Program.Data[i]);//½«¶ÔÏóѹÈëÕ»ÖÐ
});
int R;
while (data.TryPop(out R))//µ¯³öÕ»¶¥¶ÔÏó
{
Console.WriteLine(R);
}
Console.WriteLine("Ö´ÐÐÍê³ÉForEach.");
}

ok£¬ÕâÀï·µ»ØÒ»¸öÐòÁеÄÎÊÌâÒ²½â¾öÁË¡£

½áÂÛ3:ÔÚ²¢ÐÐÑ­»·ÄÚÖØ¸´²Ù×÷µÄ¶ÔÏ󣬱ØÐëÒªÊÇthread-safe(Ḭ̈߳²È«)µÄ¡£¼¯ºÏÀàµÄḬ̈߳²È«¶ÔÏóÈ«²¿ÔÚSystem.Collections.ConcurrentÃüÃû¿Õ¼äÏ¡£

ËÄ¡¢·µ»Ø¼¯ºÏÔËËã½á¹û/º¬Óоֲ¿±äÁ¿µÄ²¢ÐÐÑ­»·

ʹÓÃÑ­»·µÄʱºò¾­³£Ò²»áÓõ½µü´ú£¬ÄÇôÔÚ²¢ÐÐÑ­»·ÖнÐ×ö º¬Óоֲ¿±äÁ¿µÄÑ­»· ¡£ÏÂÃæµÄ´úÂëÖÐÏêϸµÄ½âÊÍ£¬ÕâÀï¾Í²»†ªàÂÁË¡£

/// <summary>
/// ¾ßÓÐÏֲ߳̾¿±äÁ¿µÄForÑ­»·
/// </summary>
private void Demo9()
{
List<int> data = Program.Data;
long total = 0;
//ÕâÀﶨÒå·µ»ØÖµÎªlongÀàÐÍ·½±ãÏÂÃæ¸÷¸ö²ÎÊýµÄ½âÊÍ
Parallel.For<long>(0, // ForÑ­»·µÄÆðµã
data.Count, // ForÑ­»·µÄÖÕµã
() => 0, // ³õʼ»¯¾Ö²¿±äÁ¿µÄ·½·¨(long)£¬¼ÈΪÏÂÃæµÄsubtotalµÄ³õÖµ
(i, LoopState, subtotal) => // Ϊÿ¸öµü´úµ÷ÓÃÒ»´ÎµÄίÍУ¬iÊǵ±Ç°Ë÷Òý£¬LoopStateÊÇÑ­»·×´Ì¬£¬subtotalΪ¾Ö²¿±äÁ¿Ãû
{
subtotal += data[i]; // Ð޸ľֲ¿±äÁ¿
return subtotal; // ´«µÝ²ÎÊý¸øÏÂÒ»¸öµü´ú
},
(finalResult) => Interlocked.Add(ref total, finalResult) //¶Ôÿ¸öÏ߳̽á¹ûÖ´ÐеÄ×îºó²Ù×÷£¬ÕâÀïÊǽ«ËùÓеĽá¹ûÏà¼Ó
);
Console.WriteLine(total);
}
/// <summary>
/// ¾ßÓÐÏֲ߳̾¿±äÁ¿µÄForEachÑ­»·
/// </summary>
private void Demo10()
{
List<int> data = Program.Data;
long total = 0;
Parallel.ForEach<int, long>(data, // Ҫѭ»·µÄ¼¯ºÏ¶ÔÏó
() => 0, // ³õʼ»¯¾Ö²¿±äÁ¿µÄ·½·¨(long)£¬¼ÈΪÏÂÃæµÄsubtotalµÄ³õÖµ
(i, LoopState, subtotal) => // Ϊÿ¸öµü´úµ÷ÓÃÒ»´ÎµÄίÍУ¬iÊǵ±Ç°ÔªËØ£¬LoopStateÊÇÑ­»·×´Ì¬£¬subtotalΪ¾Ö²¿±äÁ¿Ãû
{
subtotal += i; // Ð޸ľֲ¿±äÁ¿
return subtotal; // ´«µÝ²ÎÊý¸øÏÂÒ»¸öµü´ú
},
(finalResult) => Interlocked.Add(ref total, finalResult) //¶Ôÿ¸öÏ߳̽á¹ûÖ´ÐеÄ×îºó²Ù×÷£¬ÕâÀïÊǽ«ËùÓеĽá¹ûÏà¼Ó
);
Console.WriteLine(total);
}

½áÂÛ4:²¢ÐÐÑ­»·Öеĵü´ú£¬È·ÊµºÜÉËÈË¡£´úÂëÌ«ÄÑÀí½âÁË¡£

Îå¡¢PLinq£¨LinqµÄ²¢ÐмÆË㣩

ÉÏÃæ½éÉÜÍêÁËForºÍForEachµÄ²¢ÐмÆËãÊ¢Ñ磬΢ÈíҲûÍü¼ÇÔÚLinqÖмÓÈë²¢ÐмÆËã¡£ÏÂÃæ½éÉÜLinqÖеIJ¢ÐмÆËã¡£

4.0ÖÐÔÚSystem.LinqÃüÃû¿Õ¼äϼÓÈëÁËÏÂÃæ¼¸¸öеÄÀࣺ

Ô­Àí2£ºPLinq×î¶à»á¿ªÆô64¸öÏß³Ì

Ô­Àí3£ºPLinq»á×Ô¼ºÅжÏÊÇ·ñ¿ÉÒÔ½øÐв¢ÐмÆË㣬Èç¹û²»ÐÐÔò»áÒÔ˳ÐòģʽÔËÐС£

Ô­Àí4£ºPLinq»áÔÚ°º¹óµÄ²¢ÐÐËã·¨»ò³É±¾½ÏµÍµÄ˳ÐòËã·¨Ö®¼ä½øÐÐÑ¡Ôñ£¬Ä¬ÈÏÇé¿öÏÂËüÑ¡Ôñ˳ÐòËã·¨¡£

ÔÚParallelEnumerableÖÐÌṩµÄ²¢Ðл¯µÄ·½·¨

ÏÂÃæÊÇPLinqµÄ¼òµ¥´úÂë

/// <summary>
/// PLinq¼ò½é
/// </summary>
private void Demo11()
{
var source = Enumerable.Range(1, 10000);
//²éѯ½á¹û°´sourceÖеÄ˳ÐòÅÅÐò
var evenNums = from num in source.AsParallel().AsOrdered()
where num % 2 == 0
select num;
//ForAllµÄʹÓÃ
ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();
var query = from num in source.AsParallel()
where num % 10 == 0
select num;
query.ForAll((e) => concurrentBag.Add(e * e));
}

ÉÏÃæ´úÂëÖÐʹÓÃÁËForAll£¬ForAllºÍforeachµÄÇø±ðÈçÏ£º

   
5156 ´Îä¯ÀÀ       29
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
.NET Core 3.0 Õýʽ¹«²¼£ºÐÂÌØÐÔÏêϸ½â¶Á
.NET Core²¿ÊðÖÐÄã²»Á˽âµÄ¿ò¼ÜÒÀÀµÓë¶ÀÁ¢²¿Êð
C# eventḬ̈߳²È«
¼òÎö .NET Core ¹¹³ÉÌåϵ
C#¼¼ÊõÂþ̸֮À¬»ø»ØÊÕ»úÖÆ(GC)
×îпγÌ
.NetÓ¦Óÿª·¢
C#¸ß¼¶¿ª·¢¼¼Êõ
.NET ¼Ü¹¹Éè¼ÆÓëµ÷ÊÔÓÅ»¯
ASP.NET Core Web ¿ª·¢
ASP.Net MVC¿ò¼ÜÔ­ÀíÓëÓ¦Óÿª·¢
³É¹¦°¸Àý
º½Ìì¿Æ¹¤¼¯ÍÅ×Ó¹«Ë¾ DotNetÆóÒµ¼¶Ó¦ÓÃÉè¼ÆÓ뿪·¢
ÈÕÕÕ¸Û¼¯ .NET Framewor
Éñ»ªÐÅ .NETµ¥Ôª²âÊÔ
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ