相关疑难解决方法(0)

C#中Thread.Sleep的替代方案?

我有一个代码,在运行时,它按顺序执行一系列行.我想在两者之间添加一个暂停.

目前,我有这样的

//do work
Thread.Sleep(10800000);
//do work
Run Code Online (Sandbox Code Playgroud)

然而,这会冻结软件,我认为这是因为睡眠时间过长.我在网上搜索,发现另一个名为Timer的工作.有人可以给我看一个Timer的示例代码,它的工作方式与Thread.sleep类似吗?

先感谢您.

编辑:我需要软件等待3个小时才能继续执行其余的代码.该软件用于与机器通信,我不能让其余的代码在等待3个小时时执行.

.net c# multithreading threadpool

7
推荐指数
2
解决办法
2万
查看次数

在Thread.Sleep()期间保持UI响应

背景:我正在编写一个应用程序,它遍历服务器列表并获取有关每台机器的各种详细信息.在迭代期间,我需要更新表单上的各种控件(以显示所获取信息的摘要).因为它正在遍历列表,所以我调用了Thread.Sleep()以允许用户有时间在查询下一台机器之前读取信息.以下是我的代码:

Task TestTask = Task.Factory.StartNew(() =>
            {
                foreach (String IpAddress in ServersToCheck)
                {
                    if (IpAddress != String.Empty)
                    {
                        ServerBeingCheckedLabel.Text = IpAddress;
                        if (PingServer(IpAddress) == true)
                        {
                            PingChar_Label.ForeColor = Color.Green;
                            PingChar_Label.Text = "a";
                            CheckPermissionsAreValid(IpAddress);
                        }
                        else
                        {
                            PingChar_Label.ForeColor = Color.Red;
                            PingChar_Label.Text = "r";
                            PermChar_Label.ForeColor = Color.Red;
                            PermChar_Label.Text = "r";
                        }
                    }
                }
                Thread.Sleep(10000);
                this.BackColor = FormBackGroundColor;
                TestButton.Enabled = true;
                RunTimer.Enabled = true;
            }, CancellationToken.None, TaskCreationOptions.None, UiScheduler);
Run Code Online (Sandbox Code Playgroud)

这在更新窗体上的控件时工作正常,但在Thread.Sleep()期间,UI会锁定.当然,如果在单独的任务上调用Thread.Sleep(),UI线程仍然未被阻塞?

c# multithreading task

4
推荐指数
2
解决办法
1230
查看次数

async/await with thread timer

我能够通过输入表单Stephen Cleary解决问题.请参阅更新3.

我有一个Windows窗体应用程序,其中包含一个带有async修饰符的方法.如果在按钮的click事件中调用该方法,则它不会阻止UI线程.但是,当我在计时器内调用它作为回调时,它会冻结UI.我无法弄清楚我在这里做错了什么.请看下面我的代码.这只是一个用于演示目的的示例项目.

public Form1()
{
    InitializeComponent();            
}

private async void formCloseAsync()
{
    shutdown stf = new shutdown();
    stf.StartPosition = FormStartPosition.CenterScreen;
    stf.Show();
    var task = Task.Factory.StartNew(processClose);
    await task;
}

private void processClose()
{
    Thread.Sleep(5000);
    Environment.Exit(1);
}

private void simpleButtonAsync_Click(object sender, EventArgs e)
{
    formCloseAsync();
}        

private void _simpleButtonTimer_Click(object sender, EventArgs e)
{
    Timer _shutdownTimer = new Timer(delegate
    {
       formCloseAsync();
    }, null, 5000, Timeout.Infinite);
}
Run Code Online (Sandbox Code Playgroud)

更新1:谢谢大家的宝贵意见.请参阅下面的更新代码

public Form1()
    {
        InitializeComponent();

    }

    private Timer _shutdownTimer;
    private void formCloseAsync()
    {
        shutdown stf = …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous timer winforms

-1
推荐指数
1
解决办法
3310
查看次数

标签 统计

c# ×3

multithreading ×2

.net ×1

asynchronous ×1

task ×1

threadpool ×1

timer ×1

winforms ×1