gpt4 book ai didi

c# - C#多个后台工作人员访问对象

转载 作者:太空宇宙 更新时间:2023-11-03 17:54:06 24 4
gpt4 key购买 nike

我有一个字符串列表,包含大约20000个字符串,每个字符串长1000个字符。我想使用多个后台工作程序将所有这些字符串替换为在同一位置的同一字符串的反向版本。

到目前为止,我正在做的事情是:

设置后台工作人员(由于计算机具有8个核心,因此需要8个)

 for (int j = 0; j < 8; j++)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += WorkComplete;
worker.RunWorkerAsync();
}

我遇到的问题是我不知道要在doWork函数中放入什么。

dowork函数是否应该像这样继续循环:
private void DoWork(object sender, DoWorkEventArgs e)
{
while(list.count > 0)
{
reverse and add to list
}
}

还是doWork函数只执行反向操作,然后将反向的字符串传递给WorkComplete函数?
private void DoWork(object sender, DoWorkEventArgs e)
{
reverse string
r.result = reversed string
}

最佳答案

我只想提出一种替代方法。

与其创建多个BackgroundWorkers,不如创建一个BackgroundWorkers,而是在其DoWork()中使用 Parallel.ForEach() 反转字符串。

这样,它将为您最佳地处理线程数。

您仍然需要使用BackgroundWorker来避免锁定UI线程。

这是在控制台应用程序中运行的可编译示例:

using System;
using System.Linq;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
string[] data = Enumerable.Range(10000, 100).Select(i => i.ToString()).ToArray();

Parallel.ForEach(data, (item, state, index) => data[index] = Reverse(item));

foreach (var s in data)
Console.WriteLine(s);
}

public static string Reverse(string s)
{
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
}
}

另外,如果您使用的是.Net 4.5,则可以通过使用新的 await/async功能完全避免使用BackgroundWorker。

例如,创建一个默认的Windows Forms应用程序,并在其上放置一个名为 label1的Label和一个名为 button1的按钮。然后将Form1.cs文件更改为:
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
data = Enumerable.Range(10000, 1000000).Select(i => i.ToString()).ToArray();
}

async void button1_Click(object sender, EventArgs e)
{
label1.Text = "Reversing strings...";
await doWork();
label1.Text = "Reversed strings.";
}

Task doWork()
{
return Task.Factory.StartNew(() => Parallel.ForEach(data, (item, state, index) => data[index] = reverse(item)));
}

static string reverse(string s)
{
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}

readonly string[] data;
}
}

当您单击按钮时,当字符串反转时,UI将保持响应状态。

关于c# - C#多个后台工作人员访问对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16416354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com