У меня есть следующий метод:Использование ThreadPool.QueueUserWorkItem - нить неожиданно завершает работу
public void PutFile(string ID, Stream content)
{
try
{
ThreadPool.QueueUserWorkItem(o => putFileWorker(ID, content));
}
catch (Exception ex)
{
OnPutFileError(this, new ExceptionEventArgs { Exception = ex });
}
}
Метод putFileWorker выглядит следующим образом:
private void putFileWorker(string ID, Stream content)
{
//Get bucket name:
var bucketName = getBucketName(ID)
.ToLower();
//get file key
var fileKey = getFileKey(ID);
try
{
//if the bucket doesn't exist, create it
if (!Amazon.S3.Util.AmazonS3Util.DoesS3BucketExist(bucketName, s3client))
s3client.PutBucket(new PutBucketRequest { BucketName = bucketName, BucketRegion = S3Region.EU });
PutObjectRequest request = new PutObjectRequest();
request.WithBucketName(bucketName)
.WithKey(fileKey)
.WithInputStream(content);
S3Response response = s3client.PutObject(request);
var xx = response.Headers;
OnPutFileCompleted(this, new ValueEventArgs { Value = ID });
}
catch (Exception e)
{
OnPutFileError(this, new ExceptionEventArgs { Exception = e });
}
}
Я создал небольшую консоль приложение, чтобы проверить это. Я подключаю обработчики событий для событий OnPutFileError и OnPutFileCompleted.
Если я вызываю свой метод PutFile и вступаю в это, он переходит к строке «// если строка не существует, создайте ее», а затем завершается. Никаких исключений, ошибок нет, ничего. Он не завершается (я также установил точки останова на своих обработчиках событий) - он просто выходит.
Если я запускаю тот же метод без ThreadPool.QueueUserWorkItem, то он работает отлично ...
ли я что-то отсутствует?
Действительно ли это прекращает обработку, или вы получаете переключатель потоков в среде отладки? Закрывается ли ваш mainthread? (это будет Thread.Abort() все рабочие потоки) –
хорошо ... он не ударил точки останова после вышеупомянутой строки ... он просто попадает в конец статического метода void Main() ... – Alex
i также реализовано это: http://statichippo.com/archive/2009/11/09/run-generic-tasks-async-fluent-ly.aspx : var async = new AsyncQueueManager(); async.Queue (o => putFileWorker (ID, content)); имеет тот же результат! – Alex