30种图像动画特效算法(C#多线程版)(中)

简介:

这是截屏动画效果:

这次是(中),共10种特效:

 
 
  1. #region 随机竖条  
  2.  
  3. // 原理:将图像分成宽度相等的列,然后随机选择每一列并从上到下显示  
  4. private void Animator11()  
  5. {  
  6.     const float lineWidth = 40; // 竖条宽度  
  7.     const int stepCount = 12; // 竖条每次前进量  
  8.     try 
  9.     {  
  10.         OnDrawStarted(this, EventArgs.Empty);  
  11.         ClearBackground();  
  12.  
  13.         Random rnd = new Random(); // 随机数类  
  14.         // 生成每个列随机显示的次序  
  15.         int[] colIndex = new int[(int)Math.Ceiling(bmp.Width / lineWidth)];  
  16.         int index = 1; // 数组索引  
  17.         // 数组被自动初始化为0,因此可以通过判断其中的元素是否为0而得知该位置是否产生了随机数  
  18.         // 为了区别自动初始化的元素值,index从1开始  
  19.         do 
  20.         {  
  21.             int s = rnd.Next(colIndex.Length);  
  22.             if (colIndex[s] == 0)  
  23.             {  
  24.                 colIndex[s] = index++;  
  25.             }  
  26.         } while (index <= colIndex.Length);  
  27.         // 按照上面随机生成的次序逐一显示每个竖条  
  28.         for (int i = 0; i < colIndex.Length; i++)  
  29.         {  
  30.             for (int y = 0; y < bmp.Height; y += stepCount)  
  31.             {  
  32.                 RectangleF rect = new RectangleF((colIndex[i] - 1) * lineWidth, y, lineWidth, stepCount);  
  33.                 dc.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);  
  34.  
  35.                 Thread.Sleep(1 * delay);  
  36.                 ShowBmp(rect);  
  37.             }  
  38.  
  39.             Thread.Sleep(10 * delay);  
  40.         }  
  41.     }  
  42.     catch (Exception ex)  
  43.     {  
  44.         ShowError(ex.Message);  
  45.     }  
  46.     finally 
  47.     {  
  48.         OnDrawCompleted(this, EventArgs.Empty);  
  49.     }  
  50. }  
  51.  
  52. #endregion  
  53.  
  54. #region 随机拉丝  
  55.  
  56. // 原理:每次随机显示图像的一个像素行  
  57. private void Animator12()  
  58. {  
  59.     try 
  60.     {  
  61.         OnDrawStarted(this, EventArgs.Empty);  
  62.         ClearBackground();  
  63.  
  64.         Random rnd = new Random(); // 随机数类  
  65.         // 生成每个像素行的显示次序  
  66.         int[] rowIndex = new int[bmp.Height];  
  67.         int index = 1; // 数组索引  
  68.         do 
  69.         {  
  70.             int s = rnd.Next(rowIndex.Length);  
  71.             if (rowIndex[s] == 0)  
  72.             {  
  73.                 rowIndex[s] = index++;  
  74.             }  
  75.         } while (index <= rowIndex.Length);  
  76.         // 按照上面随机生成的次序逐一显示每个像素行  
  77.         for (int i = 0; i < rowIndex.Length; i++)  
  78.         {  
  79.             RectangleF rect = new RectangleF(0, (rowIndex[i] - 1), bmp.Width, 1);  
  80.             dc.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);  
  81.  
  82.             ShowBmp(rect);  
  83.             Thread.Sleep(1 * delay);  
  84.         }  
  85.     }  
  86.     catch (Exception ex)  
  87.     {  
  88.         ShowError(ex.Message);  
  89.     }  
  90.     finally 
  91.     {  
  92.         OnDrawCompleted(this, EventArgs.Empty);  
  93.     }  
  94. }  
  95.  
  96. #endregion  
  97.  
  98. #region 垂直对切  
  99.  
  100. // 原理:由图像中心向分左右两半分别向上下两个方向显示,到达边缘后按同样方向补齐另外的部分  
  101. private void Animator13()  
  102. {  
  103.     const int stepCount = 4; // 上下前进的增量像素,应能被高度整除  
  104.     try 
  105.     {  
  106.         OnDrawStarted(this, EventArgs.Empty);  
  107.         ClearBackground();  
  108.  
  109.         // 第一次循环,左半部分从垂直中心向上显示,右半部分从垂直中心向下显示  
  110.         for (int y = 0; y <= bmp.Height / 2; y += stepCount)  
  111.         {  
  112.             // 左半部分  
  113.             Rectangle rectLeft = new Rectangle(0, bmp.Height / 2 - y - stepCount, bmp.Width / 2, stepCount);  
  114.             dc.DrawImage(bmp, rectLeft, rectLeft, GraphicsUnit.Pixel);  
  115.             // 右半部分  
  116.             Rectangle rectRight = new Rectangle(bmp.Width / 2, bmp.Height / 2 + y, bmp.Width / 2, stepCount);  
  117.             dc.DrawImage(bmp, rectRight, rectRight, GraphicsUnit.Pixel);  
  118.  
  119.             ShowBmp(Rectangle.Union(rectLeft, rectRight));  
  120.             Thread.Sleep(10 * delay);  
  121.         }  
  122.         // 第二次循环,左半部分从底边向上显示,右半部分从顶边向下显示  
  123.         for (int y = 0; y <= bmp.Height / 2; y += stepCount)  
  124.         {  
  125.             // 左半部分  
  126.             Rectangle rectLeft = new Rectangle(0, bmp.Height - y - stepCount, bmp.Width / 2, stepCount);  
  127.             dc.DrawImage(bmp, rectLeft, rectLeft, GraphicsUnit.Pixel);  
  128.             // 右半部分  
  129.             Rectangle rectRight = new Rectangle(bmp.Width / 2, y, bmp.Width / 2, stepCount);  
  130.             dc.DrawImage(bmp, rectRight, rectRight, GraphicsUnit.Pixel);  
  131.  
  132.             ShowBmp(Rectangle.Union(rectLeft, rectRight));  
  133.             Thread.Sleep(10 * delay);  
  134.         }  
  135.     }  
  136.     catch (Exception ex)  
  137.     {  
  138.         ShowError(ex.Message);  
  139.     }  
  140.     finally 
  141.     {  
  142.         OnDrawCompleted(this, EventArgs.Empty);  
  143.     }  
  144. }  
  145.  
  146. #endregion  
  147.  
  148. #region 随机分块  
  149.  
  150. // 原理:框像分割为相等的正方块,然后逐个随机显示其中之一,直到全部显示完成  
  151. private void Animator14()  
  152. {  
  153.     const float blockSize = 50; // 分块尺寸,如果该尺寸为4到6时,显示效果为随机图点  
  154.     try 
  155.     {  
  156.         OnDrawStarted(this, EventArgs.Empty);  
  157.         ClearBackground();  
  158.  
  159.         Random rnd = new Random(); // 随机数类  
  160.         // 定义二维数组,对应每个分块,其中保存该块的位置索引(基于总块数)  
  161.         int[,] blockIndex = new int[(int)Math.Ceiling(bmp.Width / blockSize), (int)Math.Ceiling(bmp.Height / blockSize)];  
  162.  
  163.         // 生成随机快坐标,并填充顺序号  
  164.         int s = 1; // 分块次序(从左到右,从上到下)  
  165.         do 
  166.         {  
  167.             int x = rnd.Next(blockIndex.GetLength(0));  
  168.             int y = rnd.Next(blockIndex.GetLength(1));  
  169.             if (blockIndex[x, y] == 0)  
  170.             {  
  171.                 blockIndex[x, y] = s++;  
  172.             }  
  173.         } while (s <= blockIndex.GetLength(0) * blockIndex.GetLength(1));  
  174.  
  175.         // 按照上面随机生成的次序逐一显示所有分块  
  176.         for (int x = 0; x < blockIndex.GetLength(0); x++)  
  177.         {  
  178.             for (int y = 0; y < blockIndex.GetLength(1); y++)  
  179.             {  
  180.                 // blockIndex[x, y]中保存的是分块的显示次序,可以将其转换为对应的坐标  
  181.                 RectangleF rect = new RectangleF(((blockIndex[x, y] - 1) % blockIndex.GetLength(0)) * blockSize,  
  182.                     ((blockIndex[x, y] - 1) / blockIndex.GetLength(0)) * blockSize, blockSize, blockSize);  
  183.                 dc.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);  
  184.  
  185.                 ShowBmp(rect);  
  186.                 Thread.Sleep(10 * delay);  
  187.             }  
  188.         }  
  189.     }  
  190.     catch (Exception ex)  
  191.     {  
  192.         ShowError(ex.Message);  
  193.     }  
  194.     finally 
  195.     {  
  196.         OnDrawCompleted(this, EventArgs.Empty);  
  197.     }  
  198. }  
  199.  
  200. #endregion  
  201.  
  202. #region 对角闭幕  
  203.  
  204. // 原理:每次绘制所有图像内容,然后将不可见的区域生成闭合GraphicsPath并用背景色填充该区域  
  205. private void Animator15()  
  206. {  
  207.     const int stepCount = 4; // y轴的增量像素,应能被高度整除  
  208.     try 
  209.     {  
  210.         OnDrawStarted(this, EventArgs.Empty);  
  211.         ClearBackground();  
  212.  
  213.         // 左上角坐标p0(x0, y0)从左到右,p1(x1, y1)从上到下  
  214.         // 右下角坐标p2(x2, y2)从右到左,p3(x3, y3)从下到上  
  215.         // 这四个点与左下角点和右上角点构成不可见区域  
  216.         PointF p0 = new Point(0, 0);  
  217.         PointF p1 = new Point(0, 0);  
  218.         PointF p2 = new Point(bmp.Width - 1, bmp.Height - 1);  
  219.         PointF p3 = new Point(bmp.Width - 1, bmp.Height - 1);  
  220.         // 表示不可见区域的闭合路径  
  221.         GraphicsPath path = new GraphicsPath();  
  222.         // 以y轴stepCount个像素为增量,也可以使用x轴为增量,一般使用较短的那个轴  
  223.         for (int y = 0; y < bmp.Height; y += stepCount)  
  224.         {  
  225.             p0.X = y * Convert.ToSingle(bmp.Width) / Convert.ToSingle(bmp.Height); // 以浮点数计算,保证精度  
  226.             p1.Y = y;  
  227.             p2.X = bmp.Width - 1 - p0.X;  
  228.             p3.Y = bmp.Height - 1 - p1.Y;  
  229.             path.Reset();  
  230.             path.AddPolygon(new PointF[] { p0, new PointF(bmp.Width, 0), p3, p2, new PointF(0, bmp.Height), p1 });  
  231.             dc.DrawImage(bmp, 0, 0); // 绘制全部图像  
  232.             dc.FillPath(new SolidBrush(Color.FromKnownColor(KnownColor.ButtonFace)), path); // 填充不可见区域  
  233.  
  234.             ShowBmp(path.GetBounds());  
  235.             Thread.Sleep(10 * delay);  
  236.         }  
  237.         // 由于最后一次绘制的不可见区域并不需要,在这里使全部区域可见  
  238.         dc.DrawImage(bmp, 0, 0);  
  239.  
  240.         ShowBmp();  
  241.     }  
  242.     catch (Exception ex)  
  243.     {  
  244.         ShowError(ex.Message);  
  245.     }  
  246.     finally 
  247.     {  
  248.         OnDrawCompleted(this, EventArgs.Empty);  
  249.     }  
  250. }  
  251.  
  252. #endregion  
  253.  
  254. #region 垂直百叶(改进版)  
  255.  
  256. // 原理:在图像的垂直方向分为高度相等的若干条,然后从上到下计算每次需要显示的区域  
  257. private void Animator16()  
  258. {  
  259.     const float lineHeight = 50; // 百叶高度  
  260.     try 
  261.     {  
  262.         OnDrawStarted(this, EventArgs.Empty);  
  263.         ClearBackground();  
  264.  
  265.         GraphicsPath path = new GraphicsPath();  
  266.         TextureBrush textureBrush = new TextureBrush(bmp);  
  267.         for (int i = 0; i < lineHeight; i++) // 每条百叶逐行像素显示  
  268.         {  
  269.             for (int j = 0; j < Math.Ceiling(bmp.Height / lineHeight); j++)  
  270.             {  
  271.                 RectangleF rect = new RectangleF(0, lineHeight * j + i, bmp.Width, 1);  
  272.                 path.AddRectangle(rect);  
  273.             }  
  274.             dc.FillPath(textureBrush, path);  
  275.  
  276.             ShowBmp();  
  277.             Thread.Sleep(10 * delay);  
  278.         }  
  279.     }  
  280.     catch (Exception ex)  
  281.     {  
  282.         ShowError(ex.Message);  
  283.     }  
  284.     finally 
  285.     {  
  286.         OnDrawCompleted(this, EventArgs.Empty);  
  287.     }  
  288. }  
  289.  
  290. #endregion  
  291.  
  292. #region 压缩竖条(改进版)  
  293.  
  294. // 原理:在图像的水平方向分为宽度相等的若干条,然后逐一加宽每条竖条的宽度,并在其中显示该条图像的全部内容  
  295. private void Animator17()  
  296. {  
  297.     const float lineWidth = 100; // 分条宽度  
  298.     const int stepCount = 4; // 每次加宽的步进像素,应能被lineWidth整除  
  299.     try 
  300.     {  
  301.         OnDrawStarted(this, EventArgs.Empty);  
  302.         ClearBackground();  
  303.  
  304.         for (int i = 0; i < Math.Ceiling(bmp.Width / lineWidth); i++)  
  305.         {  
  306.             for (int j = stepCount; j <= lineWidth; j += stepCount) // 每条宽度逐渐增加,以产生缩放效果  
  307.             {  
  308.                 RectangleF sourRect = new RectangleF(lineWidth * i, 0, lineWidth, bmp.Height);  
  309.                 RectangleF destRect = new RectangleF(lineWidth * i, 0, j, bmp.Height);  
  310.                 dc.DrawImage(bmp, destRect, sourRect, GraphicsUnit.Pixel);  
  311.  
  312.                 ShowBmp(destRect);  
  313.                 Thread.Sleep(10 * delay);  
  314.             }  
  315.         }  
  316.     }  
  317.     catch (Exception ex)  
  318.     {  
  319.         ShowError(ex.Message);  
  320.     }  
  321.     finally 
  322.     {  
  323.         OnDrawCompleted(this, EventArgs.Empty);  
  324.     }  
  325. }  
  326.  
  327. #endregion  
  328.  
  329. #region 水平拉入(改进版)  
  330.  
  331. // 原理:由于内存位图与设备无关,故不能使用在水平方向逐渐改变图像分辨率(每英寸点数)的办法  
  332. // 而改为使用在水平方向拉伸显示,并逐步缩小  
  333. private void Animator18()  
  334. {  
  335.     try 
  336.     {  
  337.         OnDrawStarted(this, EventArgs.Empty);  
  338.         //ClearBackground();  
  339.  
  340.         for (float i = 1; i <= dc.DpiX; i++)  
  341.         {  
  342.             RectangleF destRect = new RectangleF(0, 0, bmp.Width * dc.DpiX / i, bmp.Height);  
  343.             RectangleF sourRect = new RectangleF(0, 0, bmp.Width, bmp.Height);  
  344.             dc.DrawImage(bmp, destRect, sourRect, GraphicsUnit.Pixel);  
  345.  
  346.             ShowBmp();  
  347.             Thread.Sleep(10 * delay);  
  348.         }  
  349.     }  
  350.     catch (Exception ex)  
  351.     {  
  352.         ShowError(ex.Message);  
  353.     }  
  354.     finally 
  355.     {  
  356.         OnDrawCompleted(this, EventArgs.Empty);  
  357.     }  
  358. }  
  359.  
  360. #endregion  
  361.  
  362. #region 三色对接(改进版)  
  363.  
  364. // 原理:使用ImageAttributes类和颜色转换矩阵处理图像,首先R和B分别从左右向中心移动,相遇后继续移动,且G从两侧向中间移动,直到相遇  
  365. private void Animator19()  
  366. {  
  367.     const int stepCount = 4; // 各个区域每次增加的像素量  
  368.     try 
  369.     {  
  370.         OnDrawStarted(this, EventArgs.Empty);  
  371.         ClearBackground();  
  372.  
  373.         // 建立三个时间段所需的5个不同颜色转换后的位图  
  374.         Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); // 位图的全部矩形区域  
  375.         // 红色分量位图  
  376.         ColorMatrix matrix = new ColorMatrix();  
  377.         matrix.Matrix00 = 1f; // R  
  378.         matrix.Matrix11 = 0f; // G  
  379.         matrix.Matrix22 = 0f; // B  
  380.         ImageAttributes attributes = new ImageAttributes();  
  381.         attributes.SetColorMatrix(matrix); // 使用R分量转换矩阵  
  382.         Bitmap redBmp = new Bitmap(bmp.Width, bmp.Height);  
  383.         Graphics.FromImage(redBmp).DrawImage(bmp, rect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);  
  384.         // 蓝色分量位图  
  385.         matrix.Matrix00 = 0f; // R  
  386.         matrix.Matrix11 = 0f; // G  
  387.         matrix.Matrix22 = 1f; // B  
  388.         attributes.SetColorMatrix(matrix); // 使用B分量转换矩阵  
  389.         Bitmap blueBmp = new Bitmap(bmp.Width, bmp.Height);  
  390.         Graphics.FromImage(blueBmp).DrawImage(bmp, rect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);  
  391.         // 红蓝分量位图  
  392.         matrix.Matrix00 = 1f; // R  
  393.         matrix.Matrix11 = 0f; // G  
  394.         matrix.Matrix22 = 1f; // B  
  395.         attributes.SetColorMatrix(matrix); // 使用B分量转换矩阵  
  396.         Bitmap redBlueBmp = new Bitmap(bmp.Width, bmp.Height);  
  397.         Graphics.FromImage(redBlueBmp).DrawImage(bmp, rect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);  
  398.         // 红绿分量位图  
  399.         matrix.Matrix00 = 1f; // R  
  400.         matrix.Matrix11 = 1f; // G  
  401.         matrix.Matrix22 = 0f; // B  
  402.         attributes.SetColorMatrix(matrix); // 使用B分量转换矩阵  
  403.         Bitmap redGreenBmp = new Bitmap(bmp.Width, bmp.Height);  
  404.         Graphics.FromImage(redGreenBmp).DrawImage(bmp, rect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);  
  405.         // 蓝绿分量位图  
  406.         matrix.Matrix00 = 0f; // R  
  407.         matrix.Matrix11 = 1f; // G  
  408.         matrix.Matrix22 = 1f; // B  
  409.         attributes.SetColorMatrix(matrix); // 使用B分量转换矩阵  
  410.         Bitmap blueGreenBmp = new Bitmap(bmp.Width, bmp.Height);  
  411.         Graphics.FromImage(blueGreenBmp).DrawImage(bmp, rect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);  
  412.  
  413.  
  414.         // 第1段:1/2时间(设从左到右时间为1),R和B分别从左右向中间移动,在1/2处相遇  
  415.         for (int x = 0; x < bmp.Width / 2; x += stepCount)  
  416.         {  
  417.             Rectangle rectR = new Rectangle(x, 0, stepCount, bmp.Height); // R的区域,从左到右  
  418.             dc.DrawImage(redBmp, rectR, rectR, GraphicsUnit.Pixel);  
  419.  
  420.             Rectangle rectB = new Rectangle(bmp.Width - x - stepCount, 0, stepCount, bmp.Height); // B的区域,从右到左  
  421.             dc.DrawImage(blueBmp, rectB, rectB, GraphicsUnit.Pixel);  
  422.  
  423.             ShowBmp(Rectangle.Union(rectR, rectB));  
  424.             Thread.Sleep(10 * delay);  
  425.         }  
  426.  
  427.         // 第2段:1/4时间,R和B从中间分别向右、左移动,G从左右向中间移动,在1/4和3/4处相遇  
  428.         ColorMatrix matrixGLeft = new ColorMatrix(); // 处理从左到右的G  
  429.         ColorMatrix matrixGRight = new ColorMatrix(); // 处理从右到左的G  
  430.         for (int x = 0; x < bmp.Width / 4; x += stepCount)  
  431.         {  
  432.             Rectangle rectBR = new Rectangle(bmp.Width / 2 - x - stepCount, 0, 2 * (x + stepCount), bmp.Height); // B和R的区域(位于中心)  
  433.             dc.DrawImage(redBlueBmp, rectBR, rectBR, GraphicsUnit.Pixel);  
  434.  
  435.             Rectangle rectGLeft = new Rectangle(x, 0, stepCount, bmp.Height); // 左侧G的区域,从左到右  
  436.             dc.DrawImage(redGreenBmp, rectGLeft, rectGLeft, GraphicsUnit.Pixel);  
  437.  
  438.             Rectangle rectGRight = new Rectangle(bmp.Width - x - stepCount, 0, stepCount, bmp.Height); // 右侧G的区域,从右到左  
  439.             dc.DrawImage(blueGreenBmp, rectGRight, rectGRight, GraphicsUnit.Pixel);  
  440.  
  441.             ShowBmp(Rectangle.Union(Rectangle.Union(rectBR, rectGLeft), rectGRight));  
  442.             Thread.Sleep(10 * delay);  
  443.         }  
  444.  
  445.         // 第3段:1/4时间,显示全色,在1/4处同时向左右两侧扩展(即每次左右各扩展stepCount像素),3/4处与1/4处相同  
  446.         for (int x = 0; x < bmp.Width / 4; x += stepCount)  
  447.         {  
  448.             Rectangle rect1_4 = new Rectangle(bmp.Width / 4 - x - stepCount, 0, 2 * (x + stepCount), bmp.Height); // 1/4处的区域  
  449.             dc.DrawImage(bmp, rect1_4, rect1_4, GraphicsUnit.Pixel);  
  450.  
  451.             Rectangle rect3_4 = new Rectangle(bmp.Width / 4 * 3 - x - stepCount, 0, 2 * (x + stepCount), bmp.Height); // 3/4处的区域  
  452.             dc.DrawImage(bmp, rect3_4, rect3_4, GraphicsUnit.Pixel);  
  453.  
  454.             ShowBmp(Rectangle.Union(rect1_4, rect3_4));  
  455.             Thread.Sleep(10 * delay);  
  456.         }  
  457.  
  458.     }  
  459.     catch (Exception ex)  
  460.     {  
  461.         ShowError(ex.Message);  
  462.     }  
  463.     finally 
  464.     {  
  465.         OnDrawCompleted(this, EventArgs.Empty);  
  466.     }  
  467. }  
  468.  
  469. #endregion  
  470.  
  471. #region 对角滑动(改进版)  
  472.  
  473. // 原理:在水平方向从右到左,在垂直方向从下到上移动图像  
  474. private void Animator20()  
  475. {  
  476.     const int movePixel = 4; // 每次移动的像素,应能被图像高度整除  
  477.     try 
  478.     {  
  479.         OnDrawStarted(this, EventArgs.Empty);  
  480.         ClearBackground();  
  481.  
  482.         RectangleF sourRect = new RectangleF(0, 0, bmp.Width, bmp.Height);  
  483.         for (int y = bmp.Height; y >= 0; y -= movePixel) // 从下到上移动图像  
  484.         {  
  485.             // 按比例计算水平方向移动的量  
  486.             RectangleF destRect = new RectangleF(y * Convert.ToSingle(bmp.Width) / bmp.Height, y, bmp.Width, bmp.Height);  
  487.             dc.DrawImage(bmp, destRect, sourRect, GraphicsUnit.Pixel);  
  488.  
  489.             ShowBmp(destRect);  
  490.             Thread.Sleep(10 * delay);  
  491.         }  
  492.     }  
  493.     catch (Exception ex)  
  494.     {  
  495.         ShowError(ex.Message);  
  496.     }  
  497.     finally 
  498.     {  
  499.         OnDrawCompleted(this, EventArgs.Empty);  
  500.     }  
  501. }  
  502.  
  503. #endregion 

    源程序没有必要解释了,当初编写的时候我就加了非常详细的注释,只要你又一定的.NET基础,应该完全可以读懂!
这里是本文的最后一部分:http://mengliao.blog.51cto.com/876134/473214










本文转自 BlackAlpha 51CTO博客,原文链接:http://blog.51cto.com/mengliao/473193,如需转载请自行联系原作者
目录
相关文章
|
29天前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
29天前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
29天前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
|
29天前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
|
29天前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
29天前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
29天前
|
Java C#
C#学习相关系列之多线程(七)---Task的相关属性用法
C#学习相关系列之多线程(七)---Task的相关属性用法
|
29天前
|
Java C#
C#学习相关系列之多线程(六)----Task的初级使用
C#学习相关系列之多线程(六)----Task的初级使用
|
29天前
|
C#
C#学习系列相关之多线程(四)----async和await的用法
C#学习系列相关之多线程(四)----async和await的用法
|
29天前
|
C# Windows
c#学习系列相关之多线程(三)----invoke和begininvoke
c#学习系列相关之多线程(三)----invoke和begininvoke