C# 如何在异步&;中从死锁中释放线程;等待

C# 如何在异步&;中从死锁中释放线程;等待,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我使用async&await方法下载项目vsoapi,但有时线程永远不会返回,它会持续等待流数据。那么我应该怎么做以防万一。我不知道下载的大概时间。如果我们可以做任何事情,等待超过24小时的线程将被挂起 请在下面的代码行中建议- public static async Task<string> DownloadProject(string Project, string sourceUrl, string targetdir, string BackPlanName, int cal

我使用async&await方法下载项目vsoapi,但有时线程永远不会返回,它会持续等待流数据。那么我应该怎么做以防万一。我不知道下载的大概时间。如果我们可以做任何事情,等待超过24小时的线程将被挂起

请在下面的代码行中建议-

public static async Task<string> DownloadProject(string Project, string sourceUrl, string targetdir, string BackPlanName, int callbyservice)
{
    FileStream fileStream = null;
    DateTime starttime = DateTime.Now;
    string str = "";
    ILogger ilogger = new Logger();
    ConfigurationSettings objXConfiguration = new ConfigurationSettings();
    System.Net.ServicePointManager.Expect100Continue = false;
    try
    {
        var username = objConfigurationSettings.UserName;
        var password = objConfigurationSettings.Password;
        using (HttpClient client = new HttpClient())
        {

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;


            client.DefaultRequestHeaders.Accept.Add(
                new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/zip"));

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(
                    System.Text.ASCIIEncoding.ASCII.GetBytes(
                        string.Format("{0}:{1}", username, password))));
            client.DefaultRequestHeaders.Add("Connection", new string[] { "Keep-Alive" });
            //=============================================================================================================
            string FilePath = targetdir + "\\" + BackPlanName;
            //  string CurrentDate = DateTime.Now.Day.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Hour.ToString() + "-" + DateTime.Now.Minute.ToString() + "-" + DateTime.Now.Second;
            str = Project + ".zip";

            if (!Directory.Exists(FilePath))
            {
                Directory.CreateDirectory(FilePath);
            }
            fileStream = new FileStream(FilePath + "\\" + str, FileMode.Create, FileAccess.Write);



            System.Net.ServicePointManager.Expect100Continue = false;

            var stream = await client.GetStreamAsync(sourceUrl).ConfigureAwait(continueOnCapturedContext: false);
            await stream.CopyToAsync(fileStream).ConfigureAwait(continueOnCapturedContext: false);



            //===========================================================================
            return FilePath + "\\" + str;
        }
    }
    catch (Exception e)
    {


       throw e;
    }

    finally {

    }
}
公共静态异步任务下载项目(字符串项目、字符串sourceUrl、字符串targetdir、字符串backpaname、int callbyservice)
{
FileStream FileStream=null;
DateTime starttime=DateTime.Now;
字符串str=“”;
ILogger ILogger=新记录器();
ConfigurationSettings objXConfiguration=新的ConfigurationSettings();
System.Net.ServicePointManager.Expect100Continue=false;
尝试
{
var username=objConfigurationSettings.username;
var password=objConfigurationSettings.password;
使用(HttpClient=new HttpClient())
{
ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
client.DefaultRequestHeaders.Accept.Add(
新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“应用程序/zip”);
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“基本”,
Convert.tobase64字符串(
System.Text.ascienceoding.ASCII.GetBytes(
格式(“{0}:{1}”,用户名,密码));
添加(“连接”,新字符串[]{“保持活动”});
//=============================================================================================================
字符串FilePath=targetdir+“\\”+背板名称;
//字符串CurrentDate=DateTime.Now.Day.ToString()+“-”+DateTime.Now.Month.ToString()+“-”+DateTime.Now.Year.ToString()+“-”+DateTime.Now.Hour.ToString()+“-”+DateTime.Now.Minute.ToString()+“-”+DateTime.Now.Second;
str=Project+“.zip”;
如果(!Directory.Exists(FilePath))
{
CreateDirectory(文件路径);
}
fileStream=newfilestream(FilePath+“\\”+str,FileMode.Create,FileAccess.Write);
System.Net.ServicePointManager.Expect100Continue=false;
var stream=await client.GetStreamAsync(sourceUrl).ConfigureAwait(continueOnCapturedContext:false);
await stream.CopyToAsync(fileStream.ConfigureAwait(continueOnCapturedContext:false);
//===========================================================================
返回FilePath+“\\”+str;
}
}
捕获(例外e)
{
投掷e;
}
最后{
}
}

只需使用取消令牌

公共静态异步任务下载项目(字符串项目、字符串源URL、字符串目标目录、字符串背板名称、int callbyservice) { CancellationTokenSource cts=新的CancellationTokenSource(); 电流互感器(1000*60*60*23); FileStream FileStream=null; DateTime starttime=DateTime.Now; 字符串str=“”; ILogger ILogger=新记录器(); ConfigurationSettings objXConfiguration=新的ConfigurationSettings(); System.Net.ServicePointManager.Expect100Continue=false; 尝试 { var username=objConfigurationSettings.username; var password=objConfigurationSettings.password; 使用(HttpClient=new HttpClient()) {

                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;


                client.DefaultRequestHeaders.Accept.Add(
                    new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/zip"));

                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                    Convert.ToBase64String(
                        System.Text.ASCIIEncoding.ASCII.GetBytes(
                            string.Format("{0}:{1}", username, password))));
                client.DefaultRequestHeaders.Add("Connection", new string[] { "Keep-Alive" });
                //=============================================================================================================
                string FilePath = targetdir + "\\" + BackPlanName;
                //  string CurrentDate = DateTime.Now.Day.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Hour.ToString() + "-" + DateTime.Now.Minute.ToString() + "-" + DateTime.Now.Second;
                str = Project + ".zip";

                if (!Directory.Exists(FilePath))
                {
                    Directory.CreateDirectory(FilePath);
                }
                fileStream = new FileStream(FilePath + "\\" + str, FileMode.Create, FileAccess.Write);



                System.Net.ServicePointManager.Expect100Continue = false;


                var stream = await client.GetStreamAsync(sourceUrl).ConfigureAwait(continueOnCapturedContext: false);
                await stream.CopyToAsync(fileStream,81920,cts.Token).ConfigureAwait(continueOnCapturedContext: true); 


                string CalculateSize = CalculateFileSize(FilePath + "\\" + str);
                object _lock = new object();
                IXMLData ixmlBackup = new XMLData();

                EventWaitHandle waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset);
                waitHandle.WaitOne();
                ixmlBackup.CreateBackupResultXML(UtlityHelper.GetFilePath(Settings.Default.BackupResult), BackPlanName, starttime.ToString(), DateTime.Now.ToString(), "Success", CalculateSize + " files copied");
                waitHandle.Set();
                // waitHandle.Dispose();

                //==================Email when download compelte in window service===========================//
                if (callbyservice == 1)
                {
                    objXConfiguration = ixmlBackup.GetSettings("application");
                    ObservableCollection<BackupPlan> BackupPlanCollection = ixmlBackup.GetBackupPlan();
                    var CurrentPlan = BackupPlanCollection.Where(r => r.BackupPlanName == BackPlanName).FirstOrDefault();
                    DeleteFile(CurrentPlan.KeepBackupFileCount, CurrentPlan.TargetLocation + CurrentPlan.BackupPlanName, objXConfiguration.EmailAlertLevel, objConfigurationSettings.Service, ilogger);
                    if (objXConfiguration.EmailAlertLevel == "1" || objXConfiguration.EmailAlertLevel == "2")
                    {
                        UtlityHelper.SendEmail(DateTime.Now.ToString() + ":" + objConfigurationSettings.Service + ":The download for the backup profile "+BackPlanName+" completed.", 1);
                    }
                    ilogger.WriteBackLog(DateTime.Now.ToString() + ":" + objConfigurationSettings.Service + ":The download for the backup profile " + BackPlanName + " completed.");
                }
                //===========================================================================
                return FilePath + "\\" + str;
            }
        }
        catch (Exception e)
        {
            IXMLData ixmlBackup = new XMLData();
            ixmlBackup.CreateBackupResultXML(UtlityHelper.GetFilePath(Settings.Default.BackupResult), BackPlanName, starttime.ToString(), DateTime.Now.ToString(), "Fail", e.Message);
            if (callbyservice == 1)
            {
                ilogger.WriteBackupException(e);
                objXConfiguration = ixmlBackup.GetSettings("application");
                if (objXConfiguration.EmailAlertLevel == "0" || objXConfiguration.EmailAlertLevel == "2")
                {
                    UtlityHelper.SendEmail(DateTime.Now.ToString() + ":" + objConfigurationSettings.Service + ": Exception:" + BackPlanName + ":" + e.Message, 1);
                }
            }
            else
            {
                throw e;
            }
            return null;
        }

        finally {
            fileStream.Flush();
            fileStream.Dispose();

        }
    }
ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
client.DefaultRequestHeaders.Accept.Add(
新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“应用程序/zip”);
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“基本”,
Convert.tobase64字符串(
System.Text.ascienceoding.ASCII.GetBytes(
格式(“{0}:{1}”,用户名,密码));
添加(“连接”,新字符串[]{“保持活动”});
//=============================================================================================================
字符串FilePath=targetdir+“\\”+背板名称;
//字符串CurrentDate=DateTime.Now.Day.ToString()+“-”+DateTime.Now.Month.ToString()+“-”+DateTime.Now.Year.ToString()+“-”+DateTime.Now.Hour.ToString()+“-”+DateTime.Now.Minute.ToString()+“-”+DateTime.Now.Second;
str=Project+“.zip”;
如果(!Directory.Exists(FilePath))
{
CreateDirectory(文件路径);
}
fileStream=newfilestream(FilePath+“\\”+str,FileMode.Create,FileAccess.Write);
System.Net.ServicePointManager.Expect100Continue=false;
var stream=await client.GetStreamAsync(sourceUrl).ConfigureAwait(continueOnCapturedContext:false);
wait stream.CopyToAsync(fileStream,81920,cts.Token);
字符串CalculateSize=CalculateFileSize(文件路径+“\\”+str);
对象_lock=新对象();
IXMLData ixmlBackup=新的XMLData();
EventWaitHandle waitHandle=新的EventWaitHandle(true,EventResetMode.AutoReset);
waitHandle.WaitOne();
ixmlBackup.CreateBackupResultXML(UtlityHelper.GetFilePath(Settings.Default.BackupResult)、BackplaName、starttime.ToString()、DateTime.Now.ToString()、“成功”、CalculateSize+“复制的文件”);
waitHandle.Set();
//waitHandle.Dispose();