Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET MVC应用程序中处理异步情况_C#_Asp.net Mvc - Fatal编程技术网

C# 在.NET MVC应用程序中处理异步情况

C# 在.NET MVC应用程序中处理异步情况,c#,asp.net-mvc,C#,Asp.net Mvc,我想了解一些基本的.NETMVC知识,所以我开始开发一个非常简单的应用程序,有点类似于Yelp。它由用户对象和业务对象组成。用户可以将企业添加到他们的“观察列表”中,当有人为该企业创建评论时,应用程序将查看“用户id-企业id”关系表,并通过电子邮件向关注该企业的用户发送新评论(以便他们可以回复) 在我的ReviewsController中,我有一个创建审阅的Create操作。在该操作返回之前,我想运行一个方法来检查是否有针对刚刚创建该评论的业务的手表 这就是我陷入困境的地方,因为我不确定在MV

我想了解一些基本的.NETMVC知识,所以我开始开发一个非常简单的应用程序,有点类似于Yelp。它由
用户
对象和
业务
对象组成。用户可以将企业添加到他们的“观察列表”中,当有人为该企业创建评论时,应用程序将查看“用户id-企业id”关系表,并通过电子邮件向关注该企业的用户发送新评论(以便他们可以回复)

在我的
ReviewsController
中,我有一个创建审阅的
Create
操作。在该操作返回之前,我想运行一个方法来检查是否有针对刚刚创建该评论的业务的手表

这就是我陷入困境的地方,因为我不确定在MVC设置中,什么是一种好的方法(?)

我所知道的是,创建评论的用户不需要等待应用程序查看“用户业务”关系表

将此查找功能创建为异步方法是一个好主意吗?我也研究了事件,但似乎事件在MVC环境中并不理想。MVC世界中是否有针对此类情况的成熟模式?

您可以使用创建异步任务。以下代码在完成创建线程并执行方法
checkwatchs
时执行
CreateReview
方法。同时,它返回操作
Create
而不等待新线程完成

public ActionResult Create()
{
     // User related task
     CreateReview();
     Task.Factory.StartNew(() =>
      {
               // system related task 
             CheckWatches();       
      });

    return View();
}

另一种方法是在视图中使用ajax。Ajax被设计为异步的,因此,它适合您的使用

无论何时单击PostReview按钮,都会向服务器发送一个ajax请求,以并行执行CheckWatches操作

下面是一个指向ajax调用的简单示例的链接:


@Jonathan Tyson指出了这一点,这显示了一些很好的背景tak选项

我正在考虑使用
QueueBackgroundWorkItem
,因为它似乎非常适合我的场景。它已经内置在.NET4.5.2中,它完成了我想要的一切


要注意90秒的限制(对每个人来说可能不是一个很好的解决方案)。就我而言,这已经足够了。

请注意,触发并忘记通常是个坏主意,因为无法知道操作是否成功,有时它会导致在失败时简单地终止进程。。。另外,如果
checkwatchs
错误地访问任何请求的数据,在37%的情况下,它会爆炸得惊人。我真的想知道如果使用任务并行不合适,更好的方法是什么。这是
async void
方法适用的场景之一。它本质上是一种“火与忘”的方式。有关不同方法的概述,以及使用“火与忘”任务的注意事项,请参见。我必须知道创建[HttpPost]操作是成功的吗?我不想每次单击按钮时都触发Ajax调用,因为创建可能会失败,而评审从一开始就不会创建。然后,在创建操作成功后,在视图中触发Ajax调用,