【问题标题】:Task.Run with parameters not working in ASP MVC but works without parameters passed inTask.Run 参数在 ASP MVC 中不起作用,但在没有传入参数的情况下工作
【发布时间】:2016-10-17 19:42:07
【问题描述】:

我有下面的代码,它在方法没有参数时有效,但在我传入参数时无效。我最初认为,当 IIS 中的上下文丢失时,参数也会丢失,所以我做了一个深拷贝,同样的事情仍然发生。我也尝试记录错误或消息,但同样的事情 - 它从不调用方法来完成任务。初始日志消息写入成功,但不是我想添加的方法中的日志消息发生在 asp mvc 项目中。我已经在这个问题上待了 2 天,在 stackoverflow 和谷歌上都没有解决方案。我添加了线程睡眠以使后台线程可能启动,但它不起作用。 currentcontroller 继承自 basecontroller 类。记录器使用 log4net。日志记录有效,我看到数据库中的条目。添加了 thread.sleep 以查看它是否通过使父线程等待后台线程启动来解决问题。有什么想法吗?

public class MainController : BaseController
{
    [HttpPost]
    public JsonResult ProcessSynchronization(int sourceId, string[] cities)
    {
        var ret = false;
        try
        {              

            if (sourceId == 1)
            { 
                var cityDeep = (string[])cities.Clone();
                Logger.Info("ABout to start BeginSynchronization ..");

                Task.Factory.StartNew(() =>
                {
                    Logger.Info("ABout to start BeginSynchronization enter..");

                    BeginSynchronization(cityDeep);
                });


                Thread.Sleep(5000);
                ret = true;
            }

        }
        catch (Exception ex)
        {
            Logger.Error(LogUtility.BuildExceptionMessage(ex), ex);
            return Json(new { result = ret, responseText = "Customer could not be activated." });
        }
        return Json(new { result = ret, responseText = "Synchronization started." });
    }

    private void BeginSynchronization (string[] cities)
    {
        Logger.Info("BeginSynchronization entry processing..");

    }
}

public class BaseController : Controller
{
    /// <summary>
    /// Get logger
    /// </summary>
    protected ILog Logger
    {
        get { return LogManager.GetLogger(GetType()); }
    }
}

【问题讨论】:

  • Thread.Sleep 的目的是什么? Logger 是如何声明的?为什么要在另一个线程(使用Task.Factory.StartNew 创建)中调用实例方法?目前尚不清楚您要达到的目标。另外,请添加整个控制器代码并仔细检查是否引发任何异常。
  • 我添加了更多细节。调用实例方法是什么意思?这是同一控制器类中的私有方法。

标签: c# asp.net-mvc multithreading iis-7


【解决方案1】:

尝试用async/await关键字修改你的方法。

public async JsonResult ProcessSynchronization(int sourceId, string[] cities)
{
    var ret = false;
    try
    {              

        if (sourceId == 1)
        { 
            var cityDeep = (string[])cities.Clone();
            Logger.Info("ABout to start BeginSynchronization ..");

            await Task.Factory.StartNew(() =>
            {
                Logger.Info("ABout to start BeginSynchronization enter..");

                BeginSynchronization(cityDeep);
            });


            ret = true;
        }

    }
    catch (Exception ex)
    {
        Logger.Error(LogUtility.BuildExceptionMessage(ex), ex);
        return Json(new { result = ret, responseText = "Customer could not be activated." });
    }
    return Json(new { result = ret, responseText = "Synchronization started." });
}

没有async/await

public JsonResult ProcessSynchronization(int sourceId, string[] cities)
{
    var ret = false;
    try
    {              

        if (sourceId == 1)
        { 
            var cityDeep = (string[])cities.Clone();
            Logger.Info("ABout to start BeginSynchronization ..");

            var thread = new Thread(() =>
            {
                Logger.Info("ABout to start BeginSynchronization enter..");

                BeginSynchronization(cityDeep);
            });
            thread.Start();


            ret = true;
        }

    }
    catch (Exception ex)
    {
        Logger.Error(LogUtility.BuildExceptionMessage(ex), ex);
        return Json(new { result = ret, responseText = "Customer could not be activated." });
    }
    return Json(new { result = ret, responseText = "Synchronization started." });
}

【讨论】:

  • 我不希望控制器等待任务完成。我希望它是火然后忘记,await 不会等它吗?
  • 不要再使用Task.Factory.StartNew。使用Task.Run
  • 这里的问题如下。该操作在线程池中执行。当动作完成时,线程被返回到线程池,任务只是被调度但没有被执行。如果您将 Task.Factory.StartNew 替换为 new Thread(...) 它应该可以正常工作
  • 不,这不起作用。我已经尝试了上面的代码,并且发生了同样的问题,它没有启动。
  • 只是补充一点,所有新旧代码都可以在本地主机上运行,​​但在部署到 godaddy 上的生产服务器时就不行了。
猜你喜欢
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2015-01-19
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多