gpt4 book ai didi

c# - 线程和递增

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

所以我认为这可能是我对全局计数器进行线程化和递增的方法中的一个根本缺陷,但这是我的问题。我有一个数据库中的文件名集合,我遍历了这些文件名,对于每个文件名,我都在顶级文件夹中搜索它。每次迭代我都会对搜索进行线程化,并在完成时递增一个计数器,这样我就可以确定它何时完成。问题是计数器从来没有达到文件总数那么高,有时它非常接近,但从未达到我的预期。

public class FindRogeRecords
{
private delegate void FindFileCaller(string folder, int uploadedID, string filename);
private Dictionary<int, string> _files;
private List<int> _uploadedIDs;
private int _filesProcessedCounter;
private bool _completed;

public void Run()
{
_files = GetFilesFromDB(); //returns a dictionary of id's and filenames
FindRogueRecords();
}

private void FindRogueRecords()
{
_uploadedIDs = new List<int>();

foreach (KeyValuePair<int, string> pair in _files)
{
var caller = new FindFileCaller(FindFile);
var result = caller.BeginInvoke(txtSource.Text, pair.Key, pair.Value, new AsyncCallback(FindFile_Completed), null);
}
}

private void FindFile(string documentsFolder, int uploadedID, string filename)
{
var docFolders = AppSettings.DocumentFolders;

foreach (string folder in docFolders)
{
string path = Path.Combine(documentsFolder, folder);
var directory = new DirectoryInfo(path);
var files = directory.GetFiles(filename, SearchOption.AllDirectories);

if (files != null && files.Length > 0) return;
}

lock (_uploadedIDs) _uploadedIDs.Add(uploadedID);
}

private void FindFile_Completed(System.IAsyncResult ar)
{
var result = (AsyncResult)ar;
var caller = (FindFileCaller)result.AsyncDelegate;

_filesProcessedCounter++;
_completed = (_files.Count == _filesProcessedCounter); //this never evaluates to true
}
}

最佳答案

您正在从多个线程访问 _filesProcessedCounter 变量而没有任何同步(即使是简单的 lock() )所以这导致了 Race Condition在您的代码中。

要增加整数变量,您可以使用 Interlocked.Increment()这是线程安全的,但考虑到以下代码行也需要同步:

_completed = (_files.Count == _filesProcessedCounter); 

我建议使用锁定对象来覆盖这两行并使代码更加清晰:

// Add this field to a class fields list
private static readonly object counterLock = new object();

// wrap access to shared variables by lock as shown below
lock (counterLock)
{
_filesProcessedCounter++;
_completed = (_files.Count == _filesProcessedCounter);
}

关于c# - 线程和递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344352/

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