我试图弄清楚线程如何在具有紧凑框架 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/