螺纹不';在C#ashx文件中,不要总是立即启动

螺纹不';在C#ashx文件中,不要总是立即启动,c#,multithreading,C#,Multithreading,我正在创建一个生成ZIP文件的web服务。每次用户请求“downloadzip.ashx”时,都会创建此线程: Thread t = new Thread(() => generateZIP(maxlat, maxlon, minlat, minlon, app, context, downloadid, rootdirectory, rstring)); t.Start(); if (!t.Join(TimeSpan.FromSeconds(120))) { t.Abort(

我正在创建一个生成ZIP文件的web服务。每次用户请求“downloadzip.ashx”时,都会创建此线程:

Thread t = new Thread(() => generateZIP(maxlat, maxlon, minlat, minlon, app, context, downloadid, rootdirectory, rstring));

t.Start();

if (!t.Join(TimeSpan.FromSeconds(120)))
{
    t.Abort();
    updateQueue(downloadid, 3);
    context.Response.Write("timeout");
}

这很好,但是当我多次请求url'downloadzip.ashx'时,有时在线程开始之前需要一分钟

对于这些东西,我经常使用承诺

Promise.Create(() =>
        {
            generateZIP(maxlat, maxlon, minlat, minlon, app, context, downloadid, rootdirectory, rstring));
            return true; //or value returned by generateZip
        }).SetTimeOut(3000).Error((ex) => //3000 is the timeout length in milliseconds
        {
            Console.WriteLine(ex);
        });
我已经把C#Promise类贴在了

您可以使用返回的SetTimeOut函数设置超时,并使该方法正常地失败。传递到Error方法的操作在出现错误或该方法花费的时间过长时执行

如果忽略超时,或指定一个小于1的值,则超时无效


快乐编码

你为什么需要一根线?每个请求都独立运行。对我来说,听起来像是XY问题。为什么在一个已经在一个单独的线程池线程中运行每个请求的环境中启动一个线程只是为了立即加入它(实际上是同步阻止它的执行)?我使用线程是因为我想控制方法generateZIP的持续时间。如果创建zip需要很长时间,我想停止执行并显示一条消息(“超时”)。@SvenNijs您提出的解决方案需要认真反思。考虑重新问你想做什么(X),而不是问你提出的问题和看似不正确的解决方案(Y)。好吧,但是我找不到另一个解决办法。此Web服务必须根据某些参数创建zip文件。但是在某些情况下,创建zip的函数需要花费很多时间。在这种情况下,我希望在一段时间(3分钟)后停止运行创建zip的函数…谢谢Michael,我将尝试此解决方案并让您知道结果。再次感谢,这看起来是一个很好的解决方案。