【发布时间】: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