当前位置: 首页 > 知识库问答 >
问题:

调用同一实例的C#任务

宦翔飞
2023-03-14

我对任务比较陌生,想在我的应用程序上实现它们。我想要的是,当页面加载时,在我的客户端对一个调用我需要的所有编目并将所有对象的JSON返回给我的客户端的函数执行一个ajax请求。服务器端的这个函数是我创建的具有多个任务的函数。因此,我对此有以下问题:

>

  • 加载该页面所需的所有目录并返回一个JSON对象是一个好的做法吗?
  • 如果任务调用一个类的同一个实例,它实际上是作为多线程工作的吗?还是在每个任务中创建实例更好?

        public JsonResult GetCatalogs()
        {
            JsonResult jSonResult = new JsonResult();
    
            try
            {
                CatalogsRepository catalogsRepository = new CatalogsRepository();
    
                Task<IList<CustomObject1>> task1 = Task.Factory.StartNew(() =>
                {
                    IList<CustomObject1> resultList1 = catalogsRepository.getFirstCatalog();
                    return resultList1;
                });
    
                Task<IList<CustomObject2>> task2 = Task.Factory.StartNew(() =>
                {
                    IList<CustomObject2> resultList2 = catalogsRepository.getSecondCatalog();
                    return resultList2;
                });
    
                Task<IList<CustomObject3>> task3 = Task.Factory.StartNew(() =>
                {
                    IList<CustomObject3> resultList3 = catalogsRepository.getThirdCatalog();
                    return resultList3;
                });
    
                jSonResult = Json(new
                {
                    result1 = task1.Result,
                    learningMaterialTypeList = task2.Result,
                    contentAssociatedList = task13.Result
                });
                jSonResult.MaxJsonLength = int.MaxValue;
                jSonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            }
            catch (Exception ex)
            {
                log.Error(ex);
                return Json(new Error { messageCode = 1, message = ex.Message });
            }
    
            return jSonResult;
        }
    
        public JsonResult GetCatalogs()
        {
            JsonResult jSonResult = new JsonResult();
    
            try
            {
                Task<IList<CustomObject1>> task1 = Task.Factory.StartNew(() =>
                {
                    CatalogsRepository catalogsRepository = new CatalogsRepository();
                    IList<CustomObject1> resultList1 = catalogsRepository.getFirstCatalog();
                    return resultList1;
                });
    
                Task<IList<CustomObject2>> task2 = Task.Factory.StartNew(() =>
                {
                    CatalogsRepository catalogsRepository = new CatalogsRepository();
                    IList<CustomObject2> resultList2 = catalogsRepository.getSecondCatalog();
                    return resultList2;
                });
    
                Task<IList<CustomObject3>> task3 = Task.Factory.StartNew(() =>
                {
                    CatalogsRepository catalogsRepository = new CatalogsRepository();
                    IList<CustomObject3> resultList3 = catalogsRepository.getThirdCatalog();
                    return resultList3;
                });
    
                jSonResult = Json(new
                {
                    result1 = task1.Result,
                    learningMaterialTypeList = task2.Result,
                    contentAssociatedList = task13.Result
                });
                jSonResult.MaxJsonLength = int.MaxValue;
                jSonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            }
            catch (Exception ex)
            {
                log.Error(ex);
                return Json(new Error { messageCode = 1, message = ex.Message });
            }
    
            return jSonResult;
        }
    

    我将MVC.NET4.0与jQuery一起使用,首先感谢您。

  • 共有1个答案

    蓟浩旷
    2023-03-14

    您的操作方法应该是异步的:

    public async Task<JsonResult> GetCatalogs()
    

    一旦你的方法是异步的,其他的事情就容易多了。您可以取消那些task.run()调用,只需正常调用方法(只要它们是异步的)和await。将这些lambda分成单独的、异步的方法(甚至C#7本地方法)可能是有意义的:

    protected async Task<IList<CustomObject1>> GetResults1()
    {
        CatalogsRepository catalogsRepository = new CatalogsRepository();
        var resultList1 = catalogsRepository.getFirstCatalog();
        return await resultList1.ToListAsync();
    });
    

    重要提示:要获得结果,您应该使用await。永远不要在异步ASP.NET环境中使用Result,因为它会死锁。

    var jsonResult = Json(new
    {
        result1 = await task1,
        learningMaterialTypeList = await task2,
        contentAssociatedList = await task3
    });
    

    在真正的多线程中,通常最好在单独的实例上工作,这样每个线程都可以有自己独立的内存缓存。话虽如此,但异步与多线程并不相同,事实上,在ASP.NET中,您可以保证不会有两个任务同时执行(除非您做了一些特殊的事情来实现这一点)。而是一次只得到一个线程。线程可能会改变,并且您的异步代码会在等待点附近跳转,但根据设计,一次只能运行一段代码。

     类似资料:
    • 本文向大家介绍C# Soap调用WebService的实例,包括了C# Soap调用WebService的实例的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 以上这篇C# Soap调用WebService的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

    • 我有一个带有@Scheduled方法的类任务,如下所示 TaskConfig创建2个相同类的不同bean: 使用基于xml的配置,我可以为下面的方法创建2个调度器,它们将在不同的时间运行。: 但是如何在Spring5中实现同样的场景呢?请建议。提前谢谢!

    • 本文向大家介绍C#调用CMD命令实例,包括了C#调用CMD命令实例的使用技巧和注意事项,需要的朋友参考一下 有时候有一些DOS命令需要我们在执行程序的时候调用,这需要使用C#提供的相关接口。 代码如下,很简单,相信大家都能看懂,我就不赘述了。

    • 本文向大家介绍C#调用WebService实例开发,包括了C#调用WebService实例开发的使用技巧和注意事项,需要的朋友参考一下 一、基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明

    • 本文向大家介绍node.js调用C++开发的模块实例,包括了node.js调用C++开发的模块实例的使用技巧和注意事项,需要的朋友参考一下 如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node。先回顾一下正统的用 C++ 开发 native 模块的方法 这个模块用Node 写的话,是这样的:

    • 本文向大家介绍Swift调用Objective-C编写的API实例,包括了Swift调用Objective-C编写的API实例的使用技巧和注意事项,需要的朋友参考一下 互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言。当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定义并提高你写 Cocoa 应用的