gpt4 book ai didi

c# - 线程 windows mobile 6 精简框架

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:39 24 4
gpt4 key购买 nike

我正在尝试弄清楚线程在具有紧凑框架 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 .

所以你的最终代码可能是这样的(为增量和 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/

24 4 0
文章推荐: c# - 在 MVC Web API 中将对象作为泛型类型( IEnumerable Get(string ViewName) )传递是一种好习惯吗?