我正在创建一个待办事项列表程序,您可以在其中添加任务,完成后,选中一个复选框,单击“更新”,然后将该任务从列表中删除(已完成)。
我创建了一个游戏化版本,可以为您完成的每项任务获得XP积分。我只是根据任务字符串的长度来计算XP。然后,总XP会显示在WinForm的标签文本上。
然后我想到了这样的想法:我希望标签显示总XP,仅显示几秒钟从任务中获得的XP,然后再次显示总XP。
我只是不知道如何在没有整个代码等待几秒钟的情况下执行此操作。我想它需要在我没有经验的单独线程中运行。
1) XPlabel shows: 1455 XP
2) User completes task
3) XPlabel shows for 2 seconds: +254 XP
4) XPlabel shows: 1709 XP
所有其他代码不会一直等待那2秒钟,而是继续运行,执行其他任务。就像更新数据存储文本文件一样。
但是,正如我提到的那样,这样做会带来缓慢的体验,因为其他用于存储任务的数据文本文件中写入/删除的代码也必须等待几秒钟。整个用户界面将保留这几秒钟。
所以...
在代码保持运行的情况下,有什么办法可以做到这一点?
代码摘录:
//removes checked items
foreach (string item in todolistCheckbox.CheckedItems)
{
string strFilePath = "tododo.data";
string strSearchText = item;
string strOldText;
string n = "";
StreamReader sr = File.OpenText(strFilePath);
while ((strOldText = sr.ReadLine()) != null)
{
if (!strOldText.Equals(strSearchText))
{
n += strOldText + Environment.NewLine;
}
//XP Calculation
xpread();
I WANT --> xplabel.text = xp; --- 2 seconds
int x;
Int32.TryParse(xp, out x);
int buffxp = strOldText.Length * 8 + x;
string xpupd = buffxp.ToString();
//write
xpwrite(xpupd);
xpupdate(xpupd);
levelup(xpupd);
}
sr.Close();
File.WriteAllText(strFilePath, n);
}
/干杯
您可以使用ThreadPool将其旋转到另一个线程上,并对其进行管理。
ThreadPool.QueueUserWorkItem(new WaitCallback(myFunction), xp);
public void myFunction(object state)
{
int xp = (int)state;
myLabel.Invoke((MethodInvoker)(() => myLabel.SelectedText = xp)); //Thread Safe Label Updater
new System.Threading.ManualResetEvent(false).WaitOne(2000); //Wait 2 Seconds
myLabel.Invoke((MethodInvoker)(() => myLabel.SelectedText = string.Empty)); //Sets the label to empty. Could also be used to put back to totalXP
}
以及您可能需要的任何其他选项。
编辑:请确保包括using System.Threading
您执行的任何线程
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句