线程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>()
什么参数
首先,您的代码可以执行不完全是您所等待的,因为您在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);
}