如何在不刷新页面的情况下显示不同的值MVC#

如何在不刷新页面的情况下显示不同的值MVC#,c#,model-view-controller,asynchronous,task,C#,Model View Controller,Asynchronous,Task,我有一个方法,可以在一个值列表中循环,我想做的是打开页面,在不刷新当前视图的情况下看到值的变化。我试过类似下面的代码 public static int myValueReader { get; set; } public static void ValueGenerator() { foreach (var item in myList) { myValue = item; Thread.Sleep(1000); } } 实际情况是,

我有一个方法,可以在一个值列表中循环,我想做的是打开页面,在不刷新当前视图的情况下看到值的变化。我试过类似下面的代码

public static int myValueReader { get; set; }

public static void ValueGenerator()
{
    foreach (var item in myList)
    {
        myValue = item;
        Thread.Sleep(1000);
    }
}

实际情况是,即使我关闭表单,我也希望它读取这些值。我想我需要分配一个任务来完成这项工作,但我想知道是否有更好的方法来完成这项工作,因为它是一个MVC应用程序?

正如@DavidTansey所提到的,您最好的选择是使用。如果用户的浏览器不支持,它会包装web套接字并返回长轮询/etc。您的用户将订阅特定的频道,然后您可以在这些频道中引发事件


关于业务逻辑,您需要研究异步编程技术。一旦你开始这样做,你可能会有更具体的问题。

这里有另一种方法:

  • 使用AJAX和设置超时
  • 在控制器中声明一个操作(此操作将返回不同的值)
  • ViewBag
    中的整数,有些类似于:
    ViewBag.totalItems
在控制器中声明操作:这很重要,因为这将是您与数据库或数据的连接。此操作将接收itemIndex并返回该项。大概是这样的:

[HttpPost]
public JsonResult GetItem(int index) {
    return Json(myList.ElementAt(index));
}
ViewBag.TotalItems:视图必须知道列表中有多少项。我建议您通过
ViewBag
将该值作为整数传递:

public ActionResult Index() {
    ViewBag.TotalItems = myList.Count();
    return View();
}
AJAX和
setTimeout
:完成所有这些后,您就可以在不刷新的情况下更新视图了:

<script>
$(function() {
    var totalItems = @Html.Raw(Json.Encode(ViewBag.TotalItems));
    var currentItemIndex = 0;

    var getData = function() {
        $.post("@Url.Action("GetItem")", {index:currentItemIndex}, function(data) {

            // data is myList.ElementAt(index)
            // do something with it

        }).always(function() {
            currentItemIndex++;

            if(currentItemIndex < totalItems) {
                setTimeout(getData, 1000); // get the next item every 1 sec
            }
        })
    }

    getData(); // start updating
})
</script>

$(函数(){
var totalItems=@Html.Raw(Json.Encode(ViewBag.totalItems));
var currentItemIndex=0;
var getData=function(){
$.post(“@Url.Action(“GetItem”),{index:currentItemIndex},函数(数据){
//数据是myList.ElementAt(索引)
//用它做点什么
}).always(函数(){
currentItemIndex++;
如果(currentItemIndex
如果您这样做是为了显示长时间运行任务的进度,请查看管道的信号器。您的目标是什么?信号器是一个选项,但需要努力进行配置。定期ajax调用如何?@axlj我有8个不同的对象,我需要它们同时读取这些值,然后如果我要查找的特定值显示在屏幕上,我需要调用一个事件。你需要,@WKara我想我的问题是:这些信息需要实时显示给用户吗?或者它可以延迟几秒钟?这如何满足实时性要求?@axlj请您向我解释为什么它不满足实时性要求,因为您现在可能已经理解了,这对我来说是一件全新的事情,所以我看不出问题所在?@WKara for me real-time意味着事件发生和用户接收通知之间的唯一延迟是由于网络延迟。在最短的时间内,您会看到至少1秒的延迟,或者2秒是最差的延迟。这就是为什么我问几秒钟有多重要。不管怎样,我很高兴您找到了一个好的解决方案:-)