【问题标题】:Read a value being manipulated in different thread读取在不同线程中操作的值
【发布时间】:2010-04-15 09:56:01
【问题描述】:

我正在尝试从一个静态类中读取一个静态属性,该类正在从不同的线程进行修改。

基本上我有这个静态类:

public static class Progress{
     public static int currentProgress{get; set;}
}

这个线程正在操纵 currentProgress:

private void Job(){
    for(int i = 0; i<100; i++){
         Progress.currentProgress = i;
         Thread.Sleep(1000);
    }
}

当它运行时,我有一个 HttpHandler 试图访问这个进度(每隔几秒),如下所示:

public void ProcessRequest(HttpContext context) {
    context.Response.Write(Progress.currentProgress.toString());
    context.Response.End();
}

但是 currentProgress 在这里设置为它的初始值,而 workThread 正在工作,只有在完成后,currentProgress 才会更新。

我意识到这可能是同步线程的问题 - 但我似乎无法找到完成此任务的最简单方法。请帮忙;)

【问题讨论】:

  • 这应该可以。无需同步对 int 的访问(除非 int 的新值是根据旧值计算得出的)。
  • 您如何访问 httphandler,我假设 javascript 使用 ajax 轮询 url 以获取您的状态?还是手动刷新?
  • 是的,使用 jQuery ajax 来轮询它;)
  • 如果你只是增加进度,你可以使用 Interlocked.Increment 方法
  • 其实我不只是递增,这只是为了简单起见,我使用总变量代替 '100' 并计算分配给 currentProgress 的百分比

标签: c# asp.net multithreading synchronization


【解决方案1】:

第一步是将静态值声明为 volatile。

【讨论】:

  • 这似乎没有改变任何东西(除此之外我不得不将它从自动属性更改为常规属性)
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多