微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows表单元素arent在触发作业C#上创建的方法内部继承

如何解决Windows表单元素arent在触发作业C#上创建的方法内部继承

在此Windows窗体应用程序中,我使用Quartz.NET的Scheduler在特定时间触发作业。 代码工作正常,但执行作业时出现问题,需要从作业创建的方法之外的表单中调用某些内容。 (textBox1.Text)不继承在触发作业上创建的方法内部。 (我认为这与Scheduler类是公共异步的事实有关,欢迎任何解释)

namespace TaxControl
{

    public partial class TaxControl : Form
    {

.........................................

public class Scheduler
        {
            public async void Start()
            {
                ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
                IScheduler scheduler = await schedulerFactory.GetScheduler();
                await scheduler.Start();

                IJobDetail job = JobBuilder.Create<Job>()
                 .WithIdentity("job","group1")
                 .Build();
            
                ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("job","group1")
                .WithCronSchedule("0 36 18 * * ?")
                .Build();
                await scheduler.ScheduleJob(job,trigger);
            }
        }

        public class Job : IJob
        {
            Task IJob.Execute(IJobExecutionContext context)
            {
                if (context == null)
                {
                    throw new ArgumentNullException(nameof(context));
                }

                Task taskA = new Task(() => InfoControl());

                taskA.Start();
                return taskA;
            }
            public void InfoControl()
            {
                MessageBox.Show(textBox1.Text);
            }
        }

解决方法

此代码存在几个问题:

  1. 显然,Job类没有对此TextBox实例的引用。通常,可以通过编写接受Job引用的TextBox构造函数来解决此问题。

  2. 但是,要使Quartz.Net使用参数化构造函数实例化该作业,您将需要使用this之类的东西来注入它,这通常也可以使用this之类的DI来完成,或this

  3. 在非UI线程上访问Control.Text会引发异常,因此这意味着您需要access the actual property by dispatching the call to the UI thread,或者只是通过传递简单的{{1} }到您的string

您还可以将Job传递给作业的构造函数,即返回Func<string>的函数。此功能还需要在线程安全的情况下进行UI访问,但是它将使工作逻辑与实际的UI脱钩。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。