【问题标题】:Thread in a web service doesn't start when called it from windows service从 Windows 服务调用 Web 服务中的线程时,它不会启动
【发布时间】:2018-01-29 16:15:49
【问题描述】:

我有一个 Windows 服务,该主体中的代码在一个经过的计时器方法中。
我在一个循环中调用一些 Web 服务,这些 Web 服务在一个线程中运行。
我检查了服务器上的服务,它们没有启动。
当我从线程体中取出代码时,这些代码起作用了。
这是我从服务器调用 web 服务的 windows 服务代码。

    private void CallServiceForTrancoding(object sender, System.Timers.ElapsedEventArgs e)
    {
            DataSet.TranscodingVideosDataTable oTranscodingVideosDataTable = new DataSet.TranscodingVideosDataTable();
            DataSetTableAdapters.TranscodingVideoTableAdapter oTranscodingVideoTableAdapter = new DataSetTableAdapters.TranscodingVideoTableAdapter();
            oTranscodingVideoTableAdapter.FillVideosForTranscoding(oTranscodingVideosDataTable);


            DataSet.ServersDataTable oServersDataTable = new DataSet.ServersDataTable();
            DataSetTableAdapters.ServersTableAdapter oServersTableAdapter = new DataSetTableAdapters.ServersTableAdapter();
            oServersTableAdapter.FillBaseOnConvertAction(oServersDataTable);

            for (int i = 0; i < oTranscodingVideosDataTable.Count; i++)
            {
                if (oTranscodingVideosDataTable[i].IsQualityNull() == false)
                {
                    var Qualities = oTranscodingVideosDataTable[i].Quality.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                    string path = oTranscodingVideosDataTable[i].Path + oTranscodingVideosDataTable[i].ObjectUniqueName;
                    string[] Url = new string[Qualities.Length];
                    for (int j = 0; j < Qualities.Length; j++)
                    {
                        if (j == 0)
                        {
                            Url[j] = path;
                        }
                        else
                        {
                            Url[j] = path.Replace(path.Split('/').Last(), "") + path.Split('/').Last().Split('.')[0] + "-" + Qualities[j] + "." + path.Split('/').Last().Split('.')[1];
                        }

                    }

                    string parameters = "Token=" + "@HelloWorld" +
                                        "&Url=" + new JavaScriptSerializer().Serialize(Url) +
                                        "&FileUniqueName=" + oTranscodingVideosDataTable[i].ObjectUniqueName +
                                        "&ip=" + oTranscodingVideosDataTable[i].IPValid +
                                        "&GregoreanDate=" + oTranscodingVideosDataTable[i].Gorean_Date.ToString();


                    DataSet.VideoDataTable oVideoDataTable = new DataSet.VideoDataTable();
                    DataSetTableAdapters.VideoTableAdapter oVideoTableAdapter = new DataSetTableAdapters.VideoTableAdapter();
                    oVideoTableAdapter.UpdateVideoStatus(oTranscodingVideosDataTable[i].ObjectUniqueName);


                    string WebServiceOfServer = oServersDataTable[i].WebService;
                    WebServiceOfServer = WebServiceOfServer.Replace(WebServiceOfServer.Split('/').Last(), "RS");

                    JavaScriptSerializer objSerializer = new JavaScriptSerializer();

                    //Task a = Task.Factory.StartNew(() => {
                    Task ResponseResult = GetPostMethods.POST(WebServiceOfServer, parameters);
                    string JSONResult = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ResponseResult);
                    var ResponseString = objSerializer.Deserialize<dynamic>(JSONResult);
                    var UserToken = ResponseString["Result"]["UserToken"];

                    var Successfully = ResponseString["Result"]["Successfully"];
                    //});
                }
            }
    }

这是我的网络方法:

[WebMethod]
public void RS(string Token, string Url, string FileUniqueName, string ip,string GregoreanDate)
{

    new Thread(() =>
    {
        if (Token != "HelloWorld")
        {

        }
        else
        {
            try
            {
                var VideoUrl = new JavaScriptSerializer().Deserialize<string[]>(Url);
                string[] FileName = new string[VideoUrl.Length];
                string[] FilePath = new string[VideoUrl.Length];
                t.VideoUniqueName = FileUniqueName.Split('.')[0];

                t.mediaOutPath = HttpContext.Current.Server.MapPath("/video/") + DateTime.Parse(GregoreanDate).Year + "\\" + DateTime.Parse(GregoreanDate).Month + "\\" + FileUniqueName.Split('.')[0] + "\\";
                t.mediaOutFolderPath = "/video/" + DateTime.Parse(GregoreanDate).Year + "/" + DateTime.Parse(GregoreanDate).Month + "/";
                if (!Directory.Exists(t.mediaOutPath))
                {
                    Directory.CreateDirectory(t.mediaOutPath);
                    Directory.CreateDirectory(t.mediaOutPath + "m3u8\\");
                }
                t.CreateFTPPathForVideoScheduler(t.VideoTypeFormKey, t.mediaOutPath);

                string Paths = "";
                for (int i = 0; i < VideoUrl.Length; i++)
                {

                    FileName[i] = VideoUrl[i].Split('/').Last();
                    if (FileName[i] != FileUniqueName)
                    {
                        FilePath[i] = t.mediaOutPath + FileName[i];
                    }
                    else
                    {
                        FilePath[i] = t.ffmpegFolderPath + FileName[i];
                    }

                    using (WebClient client = new WebClientWithAwesomeTimeouts { Timeout = new TimeSpan(10, 0, 0, 0) })
                    {
                        try
                        {
                            client.DownloadFile(VideoUrl[i], FilePath[i]);
                            client.Dispose();
                        }
                        catch (Exception ex)
                        {
                            StreamWriter sw = new StreamWriter(t.LogPath, true);
                            sw.WriteLine(ex.Message + "----" + ex.StackTrace != null ? ex.StackTrace : "" + "----" + DateTime.Now);
                            sw.Close();
                        }
                    }
                }



                DirectoryInfo FilesDirectory = new DirectoryInfo(t.ffmpegFolderPath);
                FileInfo[] fInfo = FilesDirectory.GetFiles("*" + FileUniqueName.Split('.')[0] + "*.*");

                fInfo[0].CopyTo(t.mediaOutPath + FileUniqueName, true);
                t.SendFileWithFTPScheduler(t.VideoTypeFormKey, t.mediaOutPath + FileUniqueName);

                FilesDirectory = new DirectoryInfo(t.mediaOutPath);
                fInfo = FilesDirectory.GetFiles("*" + FileUniqueName.Split('.')[0] + "*.*");
                foreach (FileInfo file in fInfo)
                {
                    t.SendFileWithFTPScheduler(t.VideoTypeFormKey, file.FullName);
                }

                string UniqueFilePath = FilePath[0].Replace(FilePath[0].Split('/').Last(), FileUniqueName);
                JavaScriptSerializer objSerializer = new JavaScriptSerializer();
                var VideoDimensions = objSerializer.Deserialize<Dictionary<string, string>>(t.getVideoHeightAndWidth(t.ffmpegFolderPath + UniqueFilePath));
                string Width = VideoDimensions["Width"];
                string Height = VideoDimensions["Height"];

                Transcoding.VideoResolutions vr = new Transcoding.VideoResolutions();
                var VideoResolutionsInfo = objSerializer.Deserialize<Dictionary<object, object>>(t.getVideoResolution(Height));
                vr.OrginalResolution = VideoResolutionsInfo["OrginalResolution"].ToString();
                vr.ResCount = Convert.ToInt32(VideoResolutionsInfo["ResCount"]);
                vr.OrginalResIndex = Convert.ToInt32(VideoResolutionsInfo["OrginalResIndex"]);
                vr.UpperResolutionHeight = VideoResolutionsInfo["UpperResolutionHeight"].ToString();

                t.MakeM3U8FormatScheduler(FileUniqueName, vr.OrginalResolution, vr.ResCount, vr.OrginalResIndex, false, "", Height);
                t.ProcessFilesScheduler(t.mediaOutPath + "m3u8\\", t.VideoTypeFormKey);

                DataSet.VideoDataTable oVideoDataTable = new DataSet.VideoDataTable();
                DataSetTableAdapters.VideoTableAdapter oVideoTableAdapter = new DataSetTableAdapters.VideoTableAdapter();
                oVideoTableAdapter.UpdateVideoForAcceptation(1, true, "mp4,m3u8", "http://" + t.mediaOutFolderPath + t.VideoUniqueName + "/", FileUniqueName);
                oVideoTableAdapter.UpdateStatus("resfinish", FileUniqueName);

                foreach (string path in VideoUrl)
                {
                    if (path.ToLower().Contains("mp4videos"))
                    {
                        t.FTPDelete(new Uri(path.Replace(new Uri(path).Host, ip).Replace("http", "ftp")));
                    }
                }

                System.IO.File.Delete(t.ffmpegFolderPath + UniqueFilePath);
                System.IO.Directory.Delete(t.mediaOutPath, true);
            }
            catch (Exception ex)
            {

            }
        }
    }).Start();
}

【问题讨论】:

    标签: c# multithreading windows-services elapsedtime


    【解决方案1】:
    Task ResponseResult = GetPostMethods.POST(WebServiceOfServer, parameters);
    string JSONResult = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ResponseResult);
    

    您正在序列化一个任务。你肯定想等待结果,不是吗?

    【讨论】:

    • 不,我不想等
    • 好吧,如果您不想等待,您将无法获得结果...您希望它如何工作?您不能返回您不等待的结果。
    • 我从我的数据库中得到结果。通过这种方式,线程中的 web 方法,我的数据库没有像我预期的那样改变。但是当我从网络方法中删除线程时,我可以在我的数据库中看到更改结果。
    • 您是否尝试过注释掉吞噬异常的 try/catch 块?
    • @LasseVågsætherKarlsen 谢谢你的推荐对我有帮助,现在我回答这个主题的问题和解决方案
    【解决方案2】:

    我调试了我的 Web 服务,发现问题与 thread is null 中的 httpcontext.current 有关。
    为此,我将HttpContext.Current.Server.MapPath("/video/") 定义为类中的变量,然后我从网络服务中调用了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2011-07-25
      相关资源
      最近更新 更多