C#延时代码--在异步方法中调用同步

标签:C#业余爱好者,代码小白,求指导

一、

我在写上位机的时候需要一个延时的代码,一开始用的

Thread.Sleep(100);

然后发现该行代码放在主程序中会影响整个线程,遂弃用。

二、

然后问Github Copilot,告诉我用异步编程,可以不阻塞程序的主线程

private async Task PerformDelayAsync()
{

    // 异步等待100毫秒,不会阻塞UI线程

    await Task.Delay(100);

    // 延时后继续执行的代码
}

结果我的函数里面需要包括unsafe代码,不能用private,await这个异步语句只能写在private里面,遂弃用。

三、

我转变想法,设计当满足一定条件后跳出while循环,未满足时则一直在while里循环的方式来执行,然后未防止一直死循环,于是查询如果xxx的值在一定时间内没有达到期望条件,应该如何处理。

Github Copilot给我推荐了“使用System.Diagnostics.Stopwatch计时”的方式,确实有效,经过测试可以循环以及满足条件跳出。

但是因为循环要写在while里面,但是while函数循环时会阻塞主程序中其他函数的运行,遂弃用

四、

于是返回异步部分,最后发现可以在异步程序内调用同步的unsafe程序,经测试可以正常调用

将(原函数)(循环函数)(unsafe函数)分开,

把原函数改为异步形式,即private async,在其中调用循环函数以及unsafe函数,

循环函数也为异步形式,写成private async Task,可在其中写循环函数而不会阻塞其他程序,

在unsafe函数中写只能在unsafe下运行的程序。

class Form1
{
    
    //1.原来的函数改为async异步形式,可以在里面调用同步的unsafe代码
    private async void SomeButton_Click(object sender, EventArgs e)
    {
        // 调用异步方法并等待其完成
        await CheckAsync();

        // 如果需要在这里使用unsafe代码
        UnsafeOperation();
    }



    //2.这是一个新的异步形式,在这里写循环函数,
    //即使在执行长时间运行的检查时,应用程序也能保持响应用户的操作。
    private async Task CheckAsync()
    {
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        long timeout = 5000; // 示例超时时间

        while (x > 0.1)
        {
            if (stopwatch.ElapsedMilliseconds > timeout)
            {
                MessageBox.Show("x<=1", "错误", MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                break;
            }

            // 异步等待一段时间再次检查,以避免阻塞UI线程
            await Task.Delay(100); // 等待100毫秒
        }
    }

    //3.在这里写只能在unsafe里运行的代码
    private unsafe void UnsafeOperation()
    {
        // 你的unsafe代码
    }
}

初学者,求指导。

你可能感兴趣的:(c#,开发语言)