当我的应用程序启动时,它刚刚升级,我正在进行本地数据库更新(sqlite).
它是这样的:用户启动我的应用程序,然后我开始升级过程.在此升级过程中,我将显示一个具有连续进度条的表单.升级过程完成后,此表单将关闭,然后用户可以开始使用我的应用程序.
但由于升级过程非常密集,因此进度条不会生成动画.
在我的旧版VB6中,我使用了一个ActiveX-Exe,它有一个表单并显示一个进度条.这是我的"背景工作者".
我不确定我是否可以在VB.NET中使用相同的方法.
我只看到了后台工作者的工作,但我没有看到任何示例,其中progressbar本身是后台工作者.
数据库升级需要阻止,用户可能在数据库升级完成之前不使用我的应用程序.这意味着只有进度条应该"进行中",而不是升级.
非常感谢你!
我对Windows Message Pump了解不多,但我想使用Message Pump触发事件.
1)当我的Web浏览器控件导航到某些网站时,它会创建不同的文档完成事件.一旦我在WebBrowser_Document_Completed()中拥有了我需要的东西,我想忽略所有进一步的文档完成.
我该怎么做?
2)如果我在Document_Completed(...)中显示MessageBox(),它会显示多个消息框,因此它在并行线程上运行,但是当我调试它时,我发现它总是在主线程上运行.
什么时候创建了另外两个线程?
3)此外,当我按下关闭它关闭窗口但该过程仍然在后台运行.我没有使用任何其他线程但我在调试时仍然看到另外两个线程.
在搜索代码以淡化winform时,我在MSDN论坛上遇到了这个页面.
for (double i = 0; i < 1; i+=0.01)
{
this.Opacity = i;
Application.DoEvents();
System.Threading.Thread.Sleep(0);
}
Run Code Online (Sandbox Code Playgroud)
该for环具有非整数递增,并从以前的问题,我问,这不是一个很好的编程技术(由于大多数小数的不精确表示).
我提出了这个替代方案.
for (double i = 0; i < 100; ++i)
{
this.Opacity = i/100;
Application.DoEvents();
System.Threading.Thread.Sleep(0);
}
Run Code Online (Sandbox Code Playgroud)
哪个更有效?
如果有一个更好的淡化表格的算法,如果包含它,我会很高兴.
谢谢.
我们聘请了一家公司将一个控制某些工业机械的旧VB6 DLL转换为C#.旧的VB6代码具有"暂停"例程,由睡眠调用和DoEvents组成,因此在休眠时,DLL中的计时器和套接字事件仍将被处理.DoEvents转换为
System.Windows.Forms.Application.DoEvents();
Run Code Online (Sandbox Code Playgroud)
我不是VB6程序员,但我的理解是VB6实际上是单线程的,因此长时间休眠会关闭所有内容,包括计时器和套接字事件处理.
当代码转换为C#时,暂停例程看起来像这样...
public static void pauseit_ms(ref int milliseconds)
{
try
{
Sleep(milliseconds / 2);
System.Windows.Forms.Application.DoEvents();
Sleep(milliseconds / 2);
}
catch (Exception exc)
{
LogException("pauseit_ms", exc);
}
}
Run Code Online (Sandbox Code Playgroud)
在.Net中,计时器和套接字事件在它们自己的线程中运行(我在这个转换后的代码中的大多数工作都是试图使它成为线程安全的!)所以DoEvents()买了什么并不明显.但是MSDN说
调用此方法会导致在处理所有等待窗口消息时挂起当前线程.
那么我们应该将这些DoEvents()保留在其他类型的事件(不是定时器或套接字回调)中吗?或者它们在.Net/C#上下文中是多余的?
我故意滥用Windows窗体应用程序中的消息循环,但我的"只是为了好玩"项目很快就超出了我的理解水平.当任务正在运行时,表单没有响应.是的,还有很多其他问题,但在我的情况下,我故意避免在另一个线程上工作(为了赢得对自己的赌注?)
我有一个在UI线程上运行(很多)短片时间的函数:get_IsComplete()检查任务是否完成; DoWork()循环从0到1000(只是为了让CPU保持温暖).该任务通过调用启动,control.BeginInvoke(new Action(ContinueWith), control);然后它(尾递归)调用自身直到完成,总是在UI线程上运行一小段工作.
public void ContinueWith(Control control)
{
if (!IsComplete)
{
DoWork();
OnNext(control);
control.BeginInvoke(new Action(ContinueWith), control);
}
else
{
OnCompleted(control);
}
}Run Code Online (Sandbox Code Playgroud)
我希望应用程序处理其他事件(鼠标点击,控制重绘,表单移动等)但似乎我的调用比我想要的更优先.
有什么建议?
我正在尝试使用WebClient对象的DownloadDataAsync方法使用C#从Internet下载文件.
我还想通过使用webclient对象的DownloadProgressChanged事件来获取下载进度.
问题是,BytesReceived和TotalBytesToReceive属性都没有显示正确的值.当我在调试时尝试检查它们时,它们都以不可复制的方式发生变化.
我的代码:
WebClient client = new WebClient();
client.BaseAddress = this.DownloadUrl;
client.DownloadProgressChanged += downloadProgressDelegate;
client.DownloadDataAsync(new System.Uri(this.DownloadUrl));
Run Code Online (Sandbox Code Playgroud) private void but_Click(object sender, RoutedEventArgs e)
{
(sender as Button).IsEnabled = false;
doSomeThing();//e.g run for more than 20 seconds
(sender as Button).IsEnabled = true;
}
Run Code Online (Sandbox Code Playgroud)
当我第一次按下按钮时它会禁用.然后启动doSomeThing()它包含UI代码或更新的一些UI变量.我的意思是,如果我在进行doSomeThing()中再次按下按钮,则but_Click此按钮启用后会再次触发事件.它保持触发事件的队列,即我按下的n次.
那么,如何在禁用按钮时阻止触发事件?请考虑在这种情况下'doSomething'包含UI控件绑定到代码.所以我们不能在这种情况下运行后台线程.帮我解决问题.
我想在C#Visual Studio 2010中制作一个图像查看器,它在几秒钟后逐个显示图像:
i = 0;
if (image1.Length > 0) //image1 is an array string containing the images directory
{
while (i < image1.Length)
{
pictureBox1.Image = System.Drawing.Image.FromFile(image1[i]);
i++;
System.Threading.Thread.Sleep(2000);
}
Run Code Online (Sandbox Code Playgroud)
当程序启动时,它会停止并向我显示第一张和最后一张图像.
按下文本框中的键,KeyDown事件发生在KeyPress之前.
我使用了计数和消息框来查看会发生什么.
以下是我的代码:
int Ncount = 0;
private void Textbox_KeyDown(object sender, KeyEventArgs e)
{
Ncount += 1;
MessageBox.Show("KeyDown's Ncount : " + Ncount.ToString());
}
private void Textbox_KeyPress(object sender, KeyPressEventArgs e)
{
Ncount += 1;
MessageBox.Show("KeyPress's Ncount : " + Ncount.ToString());
}
Run Code Online (Sandbox Code Playgroud)
当按下某个键时,这将首先显示...
KeyPress's Ncount : 2
Run Code Online (Sandbox Code Playgroud)
......接下来是这样的:
KeyDown's Ncount : 1
Run Code Online (Sandbox Code Playgroud)
KeyDown消息框(带有NCount 1)不应该显示在KeyPress消息框之前(使用Ncount 2)吗?
根据我的理解(我在线程方面不擅长),Join()会阻塞调用线程,直到调用Join()的线程返回.
如果这是真的并且从UI线程调用了Join(),则为某些长时间运行的操作创建新线程没有任何意义.有些问题,那些问为什么Join()挂起应用程序.这看起来很自然.
顺便说一句,即使它看起来很自然,我的应用程序也没有相应的行为.它不会挂起我的应用程序.
没有挂起应用程序的线程的代码: -
string retValue = "";
retValue = LongRunningHeavyFunction();
txtResult.Text = retValue;
Run Code Online (Sandbox Code Playgroud)
带有不挂应用程序的线程的代码: -
string retValue = "";
Thread thread = new Thread(
() =>
{
retValue = LongRunningHeavyFunction();
});
thread.Start();
thread.Join();
txtResult.Text = retValue;
Run Code Online (Sandbox Code Playgroud)
上面的代码很好,没有挂起应用程序 函数调用大约需要15-20秒.为什么应用程序不挂起?
这对我来说不是问题; 实际上这是一个好消息.但我只是不明白它有什么不同?它与我阅读和学习的内容不符.
如果重要的话,我正在使用DotNet Framework 4.0.