线程windows mobile 6紧凑框架

本文关键字:框架 windows mobile 线程 | 更新日期: 2023-09-27 18:08:39

我试图弄清楚线程如何在windows移动设备(6.0)与紧凑的框架2.0上工作。现在我正在尝试制作进度条,因为它是最基本的东西之一,基本上在我找到的每个教程中。

在正常的windows窗体-应用程序中,我习惯这样做:

for (int i = 0; i < 10; i++)
{
    myProgressBar.BeginInvoke(
    new Action(() =>
        {
            myProgressBar.Value = i;
            Thread.Sleep(100);
        }
    ));
}

但是我在new Action(()...得到一个错误:

类型" System.Action<T> "(泛型)的使用需要1-Type参数
(翻译自德语)

我似乎没有Action(),只有Action<T>()。但是我不知道T应该是什么参数或者给Action<T>()什么参数

线程windows mobile 6紧凑框架

首先,您的代码可以执行不完全是您所等待的,因为您在i变量上使用这里的闭包,为了正确的工作,您应该将i复制到本地变量。此外,您还可以简化代码,而不是创建Action对象,而是在这里使用简单的lambda表达式,并将其转换为Action

因此,您的最终代码可能是这样的(添加了一些小的增量和var关键字的修正):
for (var i = 0; i < 10; ++i)
{
    var localI = i;
    myProgressBar.BeginInvoke(
      (Action)(() =>
        {
            myProgressBar.Value = localI;
            Thread.Sleep(100);
        }
      ));
}

由于非泛型类对您不可用,您可以将传递给BeginInvoke的方法强制转换为来自标准库的某些委托,例如MethodInvoker(在。net框架客户端配置文件中支持)),并使用delegate关键字而不是lambda,以简化代码:

for (var i = 0; i < 10; ++i)
{
    var localI = i;
    myProgressBar.BeginInvoke(
      (MethodInvoker) delegate ()
        {
            myProgressBar.Value = localI;
            Thread.Sleep(100);
        }
      );
}

但是我希望你意识到Thread.Sleep在这里会冻结UI线程,而不是后台线程,因为你在目标线程上调用Action你最好把这些代码放到UI update:

for (var i = 0; i < 10; ++i)
{
    var localI = i;
    myProgressBar.BeginInvoke((MethodInvoker) delegate ()
        {
            myProgressBar.Value = localI;
        });
    Thread.Sleep(100);
}

当寻找MethodInvoker的替代方案时,正如@VMAtm所指出的,我终于找到了一种与紧凑框架一起工作的方法:

for (int i = 0; i < 10; i++)
{
    var localI = i;
    myProgressBar.BeginInvoke(
    (ThreadStart)delegate()
        {
            myProgressBar.Value = localI;
        }
    );
    Thread.Sleep(100);
}