首页 新闻 会员 周边

Task线程执行,定时不能执行,手动点按钮可以执行!!!!

0
悬赏园豆:120 [待解决问题]

public FrmMainScreen()
{
InitializeComponent();
_schedulerFactory = new StdSchedulerFactory();
}
private void FrmMainScreen_Load(object sender, EventArgs e)
{
start();
}

    private readonly ISchedulerFactory _schedulerFactory;
    private IScheduler _scheduler;

    private async void start()
    {
        _scheduler = await _schedulerFactory.GetScheduler();

        await _scheduler.Start();

        int settime = 20;
        var trigger = TriggerBuilder.Create()
            .WithSimpleSchedule(x => x.WithIntervalInSeconds(settime).RepeatForever())
            .Build();

        var jobDetail = JobBuilder.Create<Jobs>()
            .WithIdentity("Myjob", "group")
            .Build();

        await _scheduler.ScheduleJob(jobDetail, trigger);
    }

    public class Jobs : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(async () =>
              {
                  //这种情况下就不能运行
                  await new FrmMainScreen().Test(12);
              });
        }
    }

    // 将按钮的Click事件,可以正常运行
    private async void button2_Click(object sender, EventArgs e)
    {
       await  Test(12);
    }

    public  async Task Test(int m)
    {
        int result = await TimeConsumingMethodAsnyc(m);
        MessageBox.Show(result.ToString());
    }

    // 用async方法包装耗时函数
    private async Task<int> TimeConsumingMethodAsnyc(int arg)
    {
        return await Task.Run(() => TimeConsumingMethod(arg));
    }

    // 耗时函数
    private int TimeConsumingMethod(int arg)
    {
       Thread.Sleep(5000); // 模拟耗时过程
      //  Task.Delay(5000);
        return arg; // 有返回值
    }
  
}
王力之的主页 王力之 | 初学一级 | 园豆:38
提问于:2022-05-26 12:21
< >
分享
所有回答(2)
0

去掉Test方法中MessageBox.Show()试试

talentzemin | 园豆:759 (小虾三级) | 2022-05-26 16:28

不行的

支持(0) 反对(0) 王力之 | 园豆:38 (初学一级) | 2022-05-26 18:43
0

自己解决。定义有问题

王力之 | 园豆:38 (初学一级) | 2022-05-27 12:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册