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();
}
在.net 的WebForm中,异步程序的定时器中,请问如何将结束信息反馈到主程序?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
16条回答 默认 最新
- GISer Liu 2024-01-29 15:25关注
该回答引用自GPT-4,由博主GIS_Liu编写:
在您提供的.NET WebForm应用程序中,您希望在异步方法中使用计时器,并将计时器的结果反馈给主程序。这里的主要挑战是如何在
GetData
方法中捕获计时器事件并将结果传递回Page_Load
方法。解决这个问题的一个方法是使用TaskCompletionSource
,它可以在异步操作中用来传递结果。解决方案概述
- 在
GetData
方法中使用TaskCompletionSource
来等待计时器事件的完成。 - 在计时器事件中设置
TaskCompletionSource
的结果。 - 在
Page_Load
方法中等待GetData
方法返回的任务完成,并获取结果。
具体步骤
定义
TaskCompletionSource
: 在GetData
方法中定义一个TaskCompletionSource
实例,它将用于在计时器事件完成时传递结果。计时器事件中设置结果: 在计时器的
Elapsed
事件中,根据条件设置TaskCompletionSource
的结果。例如,当达到最大次数或有新数据时,可以停止计时器并设置结果。等待任务完成: 在
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 有人能看一下我宿舍管理系统的报修功能该怎么改啊?链表那里总是越界
- ¥15 cs loadimage运行不了,easyx也下了,没有用
- ¥15 r包runway详细安装教程
- ¥15 Html中读取Json文件中数据并制作表格
- ¥15 谁有RH342练习环境
- ¥15 STM32F407 DMA中断问题
- ¥15 uniapp连接阿里云无法发布消息和订阅
- ¥25 麦当劳点餐系统代码纠错
- ¥15 轮班监督委员会问题。
- ¥20 关于变压器的具体案例分析