减慢功能
Slowing down a function
我有一个 winforms 应用程序,我可以在 2 个公司(数据库)之间 select 并访问他们的 articles/items 以阻止或取消阻止它们。我通过 SAP B1 SDK 来完成。该功能有效,它按预期执行所有操作。 "problem" 是用户不喜欢它有多快(用户,我说的对吗?),他们让我把它调慢并添加一些视觉特征(进度条,lock/unlock 图片,附加标签) 这样他们就会知道是哪篇文章 blocked/unblocked.
这是我lock/unlock文章所在的功能:
private void items()
{
string[] lines = textBox1.Lines;
for (int i = 0; i <= lines.GetUpperBound(0); i++)
{
oItem = ((SAPbobsCOM.Items)(oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oItems)));
oItem.GetByKey(lines[i]);
if (comboBox1.Text == "Lock")
{
oItem.Frozen = BoYesNoEnum.tYES;
}
else if (comboBox1.Text == "Unlock")
{
oItem.Frozen = BoYesNoEnum.tNO;
}
lRetCode = oItem.Update();
if (lRetCode != 0)
{
oCompany.GetLastError(out lErrCode, out sErrMsg);
MessageBox.Show(lErrCode + " " + sErrMsg + " item: " + lines[i]);
}
}
}
实现此目标的最佳和正确方法是什么?我尝试使用 Thread.Sleep
但在几次失败尝试后我找不到插入代码行的位置,我尝试了操作前、操作中和操作后,但都没有成功。任何 ideas/suggestions 将不胜感激。
正在这些语句处进行锁定和解锁
oItem.Frozen = BoYesNoEnum.tYES;
和 oItem.Frozen = BoYesNoEnum.tNO;
。所以你不能从字面上 "go between" 执行那些语句。您所能做的就是在 Thread.Sleep
之前启用 WaitCursor
,然后让 freezing/unfreezing 发生。这不会阻止锁定和解锁的快速进行,但是由于 WaitCursor
的影响,用户会觉得这个过程需要一些时间。
总结:Waitcursor启用1秒-为了视觉效果,我们误导用户在幕后发生了什么,但实际上除了改变光标外什么都没有发生!
您可以将 Thread.Sleep
与 WaitCursor
结合使用,例如:
if (comboBox1.Text == "Lock")
{
Cursor.Current = Cursors.WaitCursor;
Thread.Sleep(1000);
oItem.Frozen = BoYesNoEnum.tYES;
Cursor.Current = Cursors.Default;
}
else if (comboBox1.Text == "Unlock")
{
Cursor.Current = Cursors.WaitCursor;
Thread.Sleep(1000);
oItem.Frozen = BoYesNoEnum.tNO;
Cursor.Current = Cursors.Default;
}
我有一个 winforms 应用程序,我可以在 2 个公司(数据库)之间 select 并访问他们的 articles/items 以阻止或取消阻止它们。我通过 SAP B1 SDK 来完成。该功能有效,它按预期执行所有操作。 "problem" 是用户不喜欢它有多快(用户,我说的对吗?),他们让我把它调慢并添加一些视觉特征(进度条,lock/unlock 图片,附加标签) 这样他们就会知道是哪篇文章 blocked/unblocked.
这是我lock/unlock文章所在的功能:
private void items()
{
string[] lines = textBox1.Lines;
for (int i = 0; i <= lines.GetUpperBound(0); i++)
{
oItem = ((SAPbobsCOM.Items)(oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oItems)));
oItem.GetByKey(lines[i]);
if (comboBox1.Text == "Lock")
{
oItem.Frozen = BoYesNoEnum.tYES;
}
else if (comboBox1.Text == "Unlock")
{
oItem.Frozen = BoYesNoEnum.tNO;
}
lRetCode = oItem.Update();
if (lRetCode != 0)
{
oCompany.GetLastError(out lErrCode, out sErrMsg);
MessageBox.Show(lErrCode + " " + sErrMsg + " item: " + lines[i]);
}
}
}
实现此目标的最佳和正确方法是什么?我尝试使用 Thread.Sleep
但在几次失败尝试后我找不到插入代码行的位置,我尝试了操作前、操作中和操作后,但都没有成功。任何 ideas/suggestions 将不胜感激。
正在这些语句处进行锁定和解锁
oItem.Frozen = BoYesNoEnum.tYES;
和 oItem.Frozen = BoYesNoEnum.tNO;
。所以你不能从字面上 "go between" 执行那些语句。您所能做的就是在 Thread.Sleep
之前启用 WaitCursor
,然后让 freezing/unfreezing 发生。这不会阻止锁定和解锁的快速进行,但是由于 WaitCursor
的影响,用户会觉得这个过程需要一些时间。
总结:Waitcursor启用1秒-为了视觉效果,我们误导用户在幕后发生了什么,但实际上除了改变光标外什么都没有发生!
您可以将 Thread.Sleep
与 WaitCursor
结合使用,例如:
if (comboBox1.Text == "Lock")
{
Cursor.Current = Cursors.WaitCursor;
Thread.Sleep(1000);
oItem.Frozen = BoYesNoEnum.tYES;
Cursor.Current = Cursors.Default;
}
else if (comboBox1.Text == "Unlock")
{
Cursor.Current = Cursors.WaitCursor;
Thread.Sleep(1000);
oItem.Frozen = BoYesNoEnum.tNO;
Cursor.Current = Cursors.Default;
}