我有以下方法:使用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