sunck1970 2024-01-29 15:17 采纳率: 50%
浏览 14
已结题

在.net 的WebForm中,异步程序的定时器中,请问如何将结束信息反馈到主程序?


 protected async void Page_Load(object sender, EventArgs e)
 {
     if (!IsPostBack)
     {
         Response.Write("开始" + DateTime.Now);
         

         //注册异步任务
         this.Page.RegisterAsyncTask(new PageAsyncTask(GetData1));
         await GetData();
         //就是请问这里面如何获得GetData()轮询到的信息
     }

 }


 private async Task GetData()
 {
     int nowTimes = 0;//当前循环次数(或使用Stopwatch计算时间,超时即退出)
     int maxTimes = 60;//最大循环次数(或使用Stopwatch计算时间,超时即退出)
     await Task.Delay(10);

     //计时器,每1秒种触发一次Elapsed事件
     System.Timers.Timer timer = new System.Timers.Timer(100);
     //订阅计时器的Elapsed事件    
     timer.Elapsed += async (sender, e) =>
     {
         
         //判断是否已有新数据或超时,若是则停止计时器并响应
         nowTimes++;
         if (nowTimes > maxTimes)
         {
             timer.Stop();
         }
     };
     //启动计时器       
     timer.Start();
 }
  • 写回答

16条回答 默认 最新

  • GISer Liu 2024-01-29 15:25
    关注

    该回答引用自GPT-4,由博主GIS_Liu编写:

    在您提供的.NET WebForm应用程序中,您希望在异步方法中使用计时器,并将计时器的结果反馈给主程序。这里的主要挑战是如何在GetData方法中捕获计时器事件并将结果传递回Page_Load方法。解决这个问题的一个方法是使用TaskCompletionSource,它可以在异步操作中用来传递结果。

    解决方案概述

    1. GetData方法中使用TaskCompletionSource来等待计时器事件的完成。
    2. 在计时器事件中设置TaskCompletionSource的结果。
    3. Page_Load方法中等待GetData方法返回的任务完成,并获取结果。

    具体步骤

    1. 定义TaskCompletionSource: 在GetData方法中定义一个TaskCompletionSource实例,它将用于在计时器事件完成时传递结果。

    2. 计时器事件中设置结果: 在计时器的Elapsed事件中,根据条件设置TaskCompletionSource的结果。例如,当达到最大次数或有新数据时,可以停止计时器并设置结果。

    3. 等待任务完成: 在Page_Load方法中,等待GetData方法返回的任务完成,并处理结果。

    代码示例

    protected async void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Response.Write("开始" + DateTime.Now);
            // 注册异步任务
            this.Page.RegisterAsyncTask(new PageAsyncTask(GetData1));
            var result = await GetData(); // 获取GetData方法的结果
            // 处理结果,例如通过Response.Write输出
            Response.Write(result);
        }
    }
    
    private async Task<string> GetData()
    {
        var tcs = new TaskCompletionSource<string>(); // 定义TaskCompletionSource
        int nowTimes = 0;
        int maxTimes = 60;
    
        System.Timers.Timer timer = new System.Timers.Timer(1000); // 设置计时器为1秒
        timer.Elapsed += (sender, e) =>
        {
            nowTimes++;
            if (nowTimes > maxTimes)
            {
                timer.Stop();
                tcs.SetResult("结束" + DateTime.Now); // 设置TaskCompletionSource的结果
            }
        };
    
        timer.Start(); // 启动计时器
        return await tcs.Task; // 等待并返回结果
    }
    

    注意事项

    • 在实际应用中,您可能需要根据具体的业务逻辑调整计时器事件中设置TaskCompletionSource结果的条件。
    • 确保在计时器事件中正确处理异常和计时器的停止,以避免资源泄露。
    • 使用TaskCompletionSource时,要注意线程安全和异常处理。

    通过以上步骤,您可以将异步方法中计时器的结果反馈到主程序中,实现异步操作的状态监控和结果处理。

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(15条)

报告相同问题?

问题事件

  • 系统已结题 2月13日
  • 已采纳回答 2月5日
  • 赞助了问题酬金15元 1月29日
  • 创建了问题 1月29日

悬赏问题

  • ¥15 有人能看一下我宿舍管理系统的报修功能该怎么改啊?链表那里总是越界
  • ¥15 cs loadimage运行不了,easyx也下了,没有用
  • ¥15 r包runway详细安装教程
  • ¥15 Html中读取Json文件中数据并制作表格
  • ¥15 谁有RH342练习环境
  • ¥15 STM32F407 DMA中断问题
  • ¥15 uniapp连接阿里云无法发布消息和订阅
  • ¥25 麦当劳点餐系统代码纠错
  • ¥15 轮班监督委员会问题。
  • ¥20 关于变压器的具体案例分析