첫째, 코드 :이 파일 검색 스레드를 중단하는 것이 안전합니까?
lblFileNbr.Text = "?/?";
lblFileNbr.ToolTipText = "Searching for files...";
lock(_fileLock)
{
_dirFiles = new string[0];
_fileIndex = 0;
}
if(_fileThread != null && _fileThread.IsAlive)
{
_fileThread.Abort();
}
_fileThread = new Thread(() =>
{
string dir = Path.GetDirectoryName(fileName) ?? ".";
lock (_fileLock)
{
_dirFiles = GetImageFileExtensions().SelectMany(f => Directory.GetFiles(dir, f, _searchOption)).OrderBy(f => f).ToArray();
_fileIndex = Array.IndexOf(_dirFiles, fileName);
}
int totalFileCount = Directory.GetFiles(dir, "*.*", _searchOption).Length;
Invoke((MethodInvoker)delegate
{
lblFileNbr.Text = string.Format("{0}/{1}", NumberFormat(_fileIndex + 1), NumberFormat(_dirFiles.Length));
lblFileNbr.ToolTipText = string.Format("{0} ({1} files ignored)", dir, NumberFormat(totalFileCount - _dirFiles.Length));
});
});
_fileThread.Start();
나는 작은 이미지보기 프로그램을 짓고 있어요. 이미지를 열면 동일한 디렉토리에있는 파일 수가 나열됩니다. 다른 파일 (예 : 150K)이 많은 디렉토리에서 이미지를 열면 파일 목록을 작성하는 데 몇 초가 걸립니다. 따라서이 작업을 다른 스레드에 위임합니다.
그러나 파일 검색을 완료하기 전에 다른 이미지를 열면 이전 카운트는 더 이상 적합하지 않으므로 스레드를 중단합니다.
내가 사진 사이를 전환 할 몇 가지 왼쪽 및 오른쪽 키 기능을 추가하려는 때문에 _dirFiles
및 _fileIndex
잠금, 그래서 나는 다른 곳에서 그 액세스해야합니다 (그러나 UI 스레드에서).
안전한가요? C#에서 스레드를 다루는 수십 가지 방법이있는 것처럼 보입니다. 저는 단순한 것을 원했습니다.
fileName
는 (? 오른쪽은 익명 함수에 "복사"됩니다 의미) 지역 변수이며, _searchOption
는 읽기 전용, 그래서 나는 그 둘은 접근 안전 상상한다.
+1. ** 작성하지 않은 코드는 절대 중단 할 수 없습니다 **. – usr
Hrm ... 만약 내가 그들을 중단하지 않으면 당신은 수십 개의 열린 스레드로 끝날 수 있습니다. 그, 그리고 나는 "콜백"동기화 밖으로 발사하지 않도록하기 위해 몇 가지 특별한 코드를 작성해야 겠어. – mpen