我只是想提出一种替代方法。
您可以只创建一个并在其 DoWork() 中Parallel.ForEach()
用于反转字符串,而不是创建许多 BackgroundWorker。
这样,它将为您优化处理线程数。
您仍然需要使用 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 窗体应用程序并在其上放置一个名为 Labellabel1
和一个名为 的按钮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 将在字符串反转时保持响应。