我目前正在将代码从WPF应用程序移植到控制台应用程序。在wpf viewmodel中我存储了一个整数变量(int NumberOfThreads),我可以通过在创建线程时递增来操作它,并在调用RunWorkerCompleted方法时递减。这在控制台应用程序中有点困难,因为我知道声明一个模仿全局变量的公共静态变量是一个很大的问题。
我还需要传递一个文件名,一个日志和一个bool,它表示日志中是否存在错误,还有DoWork,以及线程数整数。这就是我到目前为止所做的:
private static void ProcessFile(string file, CwiLogger log, ref int numberOfThreads, bool hasErrors)
{
Interlocked.Increment(ref numberOfThreads);
var processFileBackgroundWorker = new BackgroundWorker();
processFileBackgroundWorker.DoWork += new DoWorkEventHandler(processFileBackgroundWorker_DoWork);
processFileBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler
(processFileBackgroundWorker_RunWorkerCompleted);
var processFileTuple = new Tuple<string, CwiLogger, int, bool>(file, log, numberOfThreads, hasErrors);
processFileBackgroundWorker.RunWorkerAsync(processFileTuple);
}
这样我想我可以在DoWork函数中解压缩元组。然后将不同的元组传递给RunWorkerCompleted方法。
但是我假设这并没有通过引用DoWork函数传递它们,并且当我将它们传递给e.Results时,它也将是值而不是引用。因此,当我在RunWorkerCompleted中递减时,它将递减一个副本。