我有以下方法:使用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那麼它運行良好......
我缺少的東西?
它實際上是停止處理還是在調試環境中獲得線程切換?你的主線程關閉了嗎? (這將Thread.Abort()所有工作線程) – 2010-03-23 18:19:10
以及...它沒有打到上面提到的線後的任何斷點...它只是命中靜態無效Main()方法的結束... – Alex 2010-03-23 18:30:20
我也執行此 - 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 2010-03-23 18:39:12