【问题标题】:How to Return a value from thread?如何从线程返回值?
【发布时间】:2021-10-22 09:57:57
【问题描述】:

这里我无法从线程方法中检查 if 条件(数据)值。它直接返回else部分。基于线程值我需要检查条件。我该如何实现请帮助我。

public ActionResult Registration(VMAccount vm)
        {
            try
            {
                var existUser = accountBusiness.GetPhoneData(vm.Mobile);
                
                if (existUser.Count == 0)
                {
                    string data = "";
                    //vm.CreatedBy = GetAdminID();
                    //vm.ModifiedBy = vm.CreatedBy;
                    vm.Role = AppRole.Consumer;
                    int retValue = accountBusiness.ConsumerRegistration(vm);
                    if (retValue == 1)
                    {
                        new Thread(() =>
                        {
                            // string mobile = "1235896325";
                            data = sms.SendRegistrationOtp(vm.Mobile);
                            //data= sms.SendRegistrationOtp(mobile); 

                        }).Start();
                    }

                     if(data=="Pending")
                    {
                        return Json(2, JsonRequestBehavior.AllowGet);

                    }
                    else
                    {
                        return Json(3, JsonRequestBehavior.AllowGet);

                    }
                    
                }
                else
                {
                    return Json(1, JsonRequestBehavior.AllowGet);
                }
            }
            catch (Exception ex)
            {
                log.Error("Admin-InsertAccountDetails", ex);
                return Json(0, JsonRequestBehavior.AllowGet);
            }
        }

【问题讨论】:

  • 你应该等到线程完成后再去if-else。有一些方法可以做到这一点(stackoverflow.com/questions/1584062/…),但我认为你的sms.SendRegistrationOtp(...) 应该可以等待Task 用作data = await sms.SendRegistrationOtp(vm.Mobile); 而无需创建新线程。
  • 为什么需要一个新线程来处理sms 调用? @Auditive 查看控制器操作,它不是异步的。所以不能只是简单地在里面await
  • 当您调用Thread.Start() - 它开始,但代码没有等待它完成并继续前进。所以当涉及到if-else 时,您的data 仍然是空字符串。而且,正因为如此,您总是会遇到else 案例。
  • @Dandry 我的意思是Thread 创建不是有效的方式。即使您在方法中没有 async 关键字 - 您也可以使用 Tasks 并等待它完成。以这个小提琴为例:dotnetfiddle.net/MQ2gGw。以及为什么在ASP.NET中不能public async Task<ActionResult> Registration()在里面使用await
  • @Auditive 框架边界例如。据我所知,ASP.NET MVC 4 添加了对异步控制器操作的支持。我并不是说 OP 就是这种情况。

标签: c# asp.net asp.net-mvc multithreading controller


【解决方案1】:

我解决了这个问题

第 1 步:我为线程创建了对象 线程进程 = new Thread(() =>{线程方法});

第二步:process.start(); 进程.join();

现在我可以返回线程值了。

【讨论】:

  • 如果你只是要同步阻塞它,它完全违背了创建线程的目的。只需运行线程将直接运行的方法即可。
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 2013-11-06
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多