1

我有一个非常人为的问题。

想象一下,我有一个只有一个方法和一个字段的类。喜欢:

public class WhereAmI
{
    public int Number = 0;
    public void Looping()
    {
         for (int i = 0; i < 100; i++)
        {
            Number = i;
            Sleep(10000);
        }
    }
}

我以您期望的正常方式从另一个班级调用它

WhereAmI wai = new WhereAmI();
wai.Looping();
int CurrentNumber = wai.Number;

我想要的是一种查看我当前达到的数字并将其显示在屏幕上的方法。我已经尝试过与上面类似的方法,但这不起作用,因为编译器在完成之前不会越过 wai.Loopping() 方法。

我假设我必须在一个新线程上执行此操作,然后进入交叉线程的世界?然后我认为我的设计一定是错误的,我已经过度复杂化了!

有人愿意就此发表他们的意见或建议吗?

谢谢

4

3 回答 3

4

假设此代码在 UI 线程上运行,它可以直接在循环内更新 UI。但是,如果不想将 UI 代码与您的业务逻辑混合(这是一个好主意),那么是的,您需要在另一个线程上运行此处理并让 UI 线程检查此对象,或者最好将事件通知作为任务获取进展。

您可能应该考虑使用BackgroundWorker来处理处理。此类使处理此类任务变得更简单,并包含支持进度指示器的逻辑。

MSDN 文章中的示例代码展示了如何通过拖放到设计图面上进行大量设置(假设您使用的是 WinForms),以及如何将 BackgroundWorker 链接到进度条。

于 2012-10-22T12:57:43.247 回答
1

使用回调或事件处理程序将所有内容保持在同一个线程上。

回调:

public void Looping(Action onIncrement)
{
   for (int i = 0; i < 100; i++)
   {
      Number = i;
      onIncrement();
      Sleep(10000);
   }
}

obj.Looping(() => Console.WriteLine(obj.Number));

事件处理程序:

public event EventHandler Increment;

public void Looping()
{
   for (int i = 0; i < 100; i++)
   {
      Number = i;
      if (Increment != null)
      {
          Increment(this, EventArgs.Empty);
      }
      Sleep(10000);
   }
}

obj.Increment += (s, e) => Console.WriteLine(obj.Number);
obj.Looping();
于 2012-10-22T13:07:14.573 回答
1

这是一个使用 ThreadPool 进行线程处理的基本示例:

void Main()
{
   var pooling = new JustPooling();

   pooling.RunThread();

   Thread.Sleep(500);

   while (pooling.Operating)
   {
      Console.Write (" " + pooling.CurrentIndex);
      Thread.Sleep(500);
   }

   Console.Write(" Done");
   /* 1 1 2 2 2 3 3 3 4 4 4 5 5 5 Done */


}

// Define other methods and classes here

public class JustPooling
{
   public bool Operating { get; set; }
   public int CurrentIndex { get; set; }

   public void RunThread()
   {
       ThreadPool.QueueUserWorkItem(delegate
        {
            Operating = true;

            for ( int index = 0; index < 5; ++index )
            {
                ++CurrentIndex;
                Thread.Sleep( 1500 );
            }

            Operating = false;
        });
   }

}

要查看锁定关键部分的此示例,请参阅C# MultiThreading Using ThreadPool, Anonymous Delegates and Locks

于 2012-10-22T13:04:42.180 回答