c# - Windows Mobile 6 紧凑框架的线程化

标签 c# multithreading lambda windows-mobile compact-framework

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

从普通的 Windows 窗体 - 我用来执行类似操作的应用程序:

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

但是我在 new Action(()... 处收到错误:

The usage of type "System.Action<T>"(generic) requires the 1-Type argument
(translated from German)

看来Action()不适用于我,仅 Action<T>() 。但我不知道什么参数T应该是或者给Action<T>()什么参数.

最佳答案

首先,您的代码可以不完全执行您正在等待的操作,因为您在 i 变量上使用此处的闭包,为了正确工作,您应该复制 i 到局部变量。另外,您可以简化代码,而不是创建 Action 对象,而是 use simple lambda expression here, and convert it to Action

所以你的最终代码可能是这样的(对increment和var关键字添加了一些小修正):

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

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

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 更新之外:

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

关于c# - Windows Mobile 6 紧凑框架的线程化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32067366/

相关文章:

java - ConcurrentMap 条目同步而不阻塞整个 map

c++ - 检测/获取 lambda 函数的捕获值

java - lambda 中的无限 while 循环内的 Thread.sleep 不需要 'catch (InterruptedException)' - 为什么不呢?

c# - Lambda 表达式委托(delegate)强类型与弱类型隐式转换方法

c# - Fluent NHibernate - 从映射覆盖表名

c# - 在新标签页中打开 PDF

c# - 共享目标 Universal Apps Windows 10 方法

c# - 在两个 C# 项目之间使用 #define

multithreading - 如何在线程内接收 WM_POWERBROADCAST?

multithreading - 信号量小书