Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用多个线程完成单个任务_C#_Multithreading - Fatal编程技术网

C#使用多个线程完成单个任务

C#使用多个线程完成单个任务,c#,multithreading,C#,Multithreading,大家好 我有一个关于C#和线程的问题,我还是线程新手,我有一个基于线程的作业。我的目标是让用户指定线程数量,并以此为基础,即应用程序需要使用多少线程来完成任务 我的任务是用中值3 x 3矩阵模糊图像。这一部分我成功地写了下来(可能不是最有效的代码),但现在我需要让不同数量的线程运行blur方法,我完全迷茫了 以下是我的方法: public void Blur(Bitmap bmpInput) { Bitmap temp; float sumR,

大家好

我有一个关于C#和线程的问题,我还是线程新手,我有一个基于线程的作业。我的目标是让用户指定线程数量,并以此为基础,即应用程序需要使用多少线程来完成任务

我的任务是用中值3 x 3矩阵模糊图像。这一部分我成功地写了下来(可能不是最有效的代码),但现在我需要让不同数量的线程运行blur方法,我完全迷茫了

以下是我的方法:

    public void Blur(Bitmap bmpInput)
    {

        Bitmap temp;
        float sumR, sumB, sumG;
        Color c;

        temp = bmpInput;

        for (int i = 0; i <= bmpInput.Width - 3; i++)
            for (int j = 0; j <= bmpInput.Height - 3; j++)
            {
                sumB = 0;
                sumG = 0;
                sumR = 0;
                for (int x = i; x <= i + 2; x++)
                    for (int y = j; y <= j + 2; y++) 
                    {
                        c = bmpInput.GetPixel(x, y);
                        sumR = sumR + c.R; 
                        sumG = sumG + c.G;
                        sumB = sumB + c.B;
                    }

                byte colorR = (byte)(sumR / 9);
                byte colorG = (byte)(sumG / 9);
                byte colorB = (byte)(sumB / 9);
                temp.SetPixel(i + 1, j + 1, Color.FromArgb(colorR, colorG, colorB));

            }
        temp.Save("C:\\Users\\Username\\Desktop\\whatever.jpg");

    }
公共空白模糊(位图bmpInput)
{
位图温度;
浮子集水坑、集水坑、集水坑;
颜色c;
温度=bmpInput;

对于(int i=0;i我们可以使用带有队列概念的任务库。因为任务库有效地使用核心。 让我们使用global BlockingCollection来存储所有传入的位图图像

BlockingCollection<Bitmap> processedBitmaps = new BlockingCollection<Bitmap>();
是threadSafe收藏吗

BlockingCollection<Bitmap> incomingBitmaps = new BlockingCollection<Bitmap>();
BlockingCollection incomingbitmap=new BlockingCollection();
还有一个用于处理位图图像的全局BlockingCollection

BlockingCollection<Bitmap> processedBitmaps = new BlockingCollection<Bitmap>();
BlockingCollection processedBitmaps=new BlockingCollection();
让我们有三种方法负责
用于创建任务/线程
读取传入位图并存储到传入位图队列
处理后的位图将被排序到processedBitmaps队列

   BlockingCollection<Bitmap> incomingBitmaps = new BlockingCollection<Bitmap>();
   BlockingCollection<Bitmap> processedBitmaps = new BlockingCollection<Bitmap>();
public static void  SpawnThreads()
 {
 List<Task> ReaderTasks = new List<Task>();
TaskFactory tfReader = new TaskFactory();

public List<Task> ProcessTasks = new List<Task>();
public TaskFactory tfProcess = new TaskFactory();

//you can create threads as many you want
 for (int i = 0; i <2; i++)
 {
ReaderTasks .Add(tfReader.StartNew(() => ReadBitmaps());
}
 for (int i = 0; i <5; i++)
 {
ProcessTasks.Add(tfProcess.StartNew(() => MedianFiltering());
}
}
public static void ReadBitmaps()
    {
//logic to get bitmap images
Bitmap bmp= GetBitmapImage();
incomingBitmaps.Add(bmp);
}

public static void MedianFiltering()
    {
 foreach (var bm in incomingBitmaps.GetConsumingEnumerable())
            {
        List<byte> termsList = new List<byte>();

        byte[,] image = new byte[bm.Width, bm.Height];

        //applying Median Filtering 
        for (int i = 0; i <= bm.Width - 3; i++)
            for (int j = 0; j <= bm.Height - 3; j++)
            {
                for (int x = i; x <= i + 2; x++)
                    for (int y = j; y <= j + 2; y++)
                    {
                        termsList.Add(image[x, y]);

                    }
                byte[] terms = termsList.ToArray();
                termsList.Clear();
                Array.Sort<byte>(terms);
                Array.Reverse(terms);
                byte color = terms[4];
                bm.SetPixel(i + 1, j + 1, Color.FromArgb(color, color, color));
            }
processedBitmaps.Add(bm);
}
  }
BlockingCollection incomingbitmap=new BlockingCollection();
BlockingCollection processedBitmaps=新建BlockingCollection();
公共静态无效线程()
{
List ReaderTasks=新建列表();
TaskFactory tfReader=新建TaskFactory();
public List ProcessTasks=new List();
public TaskFactory tfProcess=new TaskFactory();
//您可以创建任意数量的线程
对于(int i=0;i读取位图());
}
对于(int i=0;i MedianFiltering());
}
}
公共静态void ReadBitmaps()
{
//获取位图图像的逻辑
位图bmp=GetBitmapImage();
输入位图。添加(bmp);
}
公共静态void MedianFiltering()
{
foreach(incomingBitmaps.GetConsumingEnumerable()中的var bm)
{
列表项列表=新列表();
字节[,]图像=新字节[bm.Width,bm.Height];
//应用中值滤波

对于(int i=0;i我们可以使用带有队列概念的任务库。因为任务库有效地使用核心。 让我们使用global BlockingCollection来存储所有传入的位图图像

BlockingCollection<Bitmap> processedBitmaps = new BlockingCollection<Bitmap>();
是threadSafe收藏吗

BlockingCollection<Bitmap> incomingBitmaps = new BlockingCollection<Bitmap>();
BlockingCollection incomingbitmap=new BlockingCollection();
还有一个用于处理位图图像的全局BlockingCollection

BlockingCollection<Bitmap> processedBitmaps = new BlockingCollection<Bitmap>();
BlockingCollection processedBitmaps=new BlockingCollection();
让我们有三种方法负责
用于创建任务/线程
读取传入位图并存储到传入位图队列
处理后的位图将被排序到processedBitmaps队列

   BlockingCollection<Bitmap> incomingBitmaps = new BlockingCollection<Bitmap>();
   BlockingCollection<Bitmap> processedBitmaps = new BlockingCollection<Bitmap>();
public static void  SpawnThreads()
 {
 List<Task> ReaderTasks = new List<Task>();
TaskFactory tfReader = new TaskFactory();

public List<Task> ProcessTasks = new List<Task>();
public TaskFactory tfProcess = new TaskFactory();

//you can create threads as many you want
 for (int i = 0; i <2; i++)
 {
ReaderTasks .Add(tfReader.StartNew(() => ReadBitmaps());
}
 for (int i = 0; i <5; i++)
 {
ProcessTasks.Add(tfProcess.StartNew(() => MedianFiltering());
}
}
public static void ReadBitmaps()
    {
//logic to get bitmap images
Bitmap bmp= GetBitmapImage();
incomingBitmaps.Add(bmp);
}

public static void MedianFiltering()
    {
 foreach (var bm in incomingBitmaps.GetConsumingEnumerable())
            {
        List<byte> termsList = new List<byte>();

        byte[,] image = new byte[bm.Width, bm.Height];

        //applying Median Filtering 
        for (int i = 0; i <= bm.Width - 3; i++)
            for (int j = 0; j <= bm.Height - 3; j++)
            {
                for (int x = i; x <= i + 2; x++)
                    for (int y = j; y <= j + 2; y++)
                    {
                        termsList.Add(image[x, y]);

                    }
                byte[] terms = termsList.ToArray();
                termsList.Clear();
                Array.Sort<byte>(terms);
                Array.Reverse(terms);
                byte color = terms[4];
                bm.SetPixel(i + 1, j + 1, Color.FromArgb(color, color, color));
            }
processedBitmaps.Add(bm);
}
  }
BlockingCollection incomingbitmap=new BlockingCollection();
BlockingCollection processedBitmaps=新建BlockingCollection();
公共静态无效线程()
{
List ReaderTasks=新建列表();
TaskFactory tfReader=新建TaskFactory();
public List ProcessTasks=new List();
public TaskFactory tfProcess=new TaskFactory();
//您可以创建任意数量的线程
对于(int i=0;i读取位图());
}
对于(int i=0;i MedianFiltering());
}
}
公共静态void ReadBitmaps()
{
//获取位图图像的逻辑
位图bmp=GetBitmapImage();
输入位图。添加(bmp);
}
公共静态void MedianFiltering()
{
foreach(incomingBitmaps.GetConsumingEnumerable()中的var bm)
{
列表项列表=新列表();
字节[,]图像=新字节[bm.Width,bm.Height];
//应用中值滤波

对于(int i=0;i So….你的问题是什么?如果你想提高速度,直接处理位图数据,不要使用
bm.SetPixel(i+1,j+1,Color.FromArgb(Color,Color,Color));
“此时我正在考虑将图像“拆分”并让每个线程将该方法应用于图像的一部分。”听起来是个不错的计划。问题是什么?我不是100%确定如何实现线程,我从来没有使用过线程,所以我希望有人能告诉我如何在这个场景中实现线程。有无数关于线程的教程。我不知道为什么你会期望问答网站上有更好的东西,除非你是hoping某人为你做这项工作。那么……你的问题是什么?如果你想提高速度,直接处理位图数据,不要使用
bm.SetPixel(i+1,j+1,Color.FromArgb(Color,Color,Color));
“此时我正在考虑将图像“拆分”并让每个线程将该方法应用于图像的一部分。”听起来是个不错的计划。问题是什么?我不是100%确定如何实现线程,我从来没有使用过线程,所以我希望有人能告诉我如何在这个场景中实现线程。有无数关于线程的教程。我不知道为什么你会期望问答网站上有更好的东西,除非你是ho让某人为你做这项工作。