试图从另一个类调用Form中的方法

时间:2016-02-17 12:07:26

标签: c# quartz-scheduler quartz.net

我知道以前已经回答了这个问题,但我被困住了。我有这门课,

public class Job : IJob
{
    public void Execute(IJobExecutionContext context)
    {

    }
}

我想调用另一个类中的这个方法:

namespace MySync
{
  public partial class Sync1 : Form
  {
      public void startSync()
      {
         // ...

如何访问startSync()?使它成为static无助于导致文本框等内部。

5 个答案:

答案 0 :(得分:1)

您的from random import * legislators = { "Tsang Yok-sing" : "DAB", "Albert Ho" : "Democratic", "Lee Cheuk-yan" : "Labour", "James To" : "Democratic", "Chan Kam-lam" : "DAB", "Lau Wong-fat" : "Economic Synergy", "Emily Lau" : "Democratic" } names = list(legislators.keys()) parties = list(legislators.values()) numberCorrect = 0 for i in range(0, 5): name = names[randrange(len(names))] party = parties[randrange(len(parties))] ans = raw_input("Does "+name+" belong to "+party+ " Y/N?") if ans == 'Y': if legislators[name] == party: print 'correct' else: print 'error' elif ans == 'N': if legislators[name] == party: print 'error' else: print 'correct' 方法包含在startSync的班级Sync中。您宁可在单独的类中重构和提取该方法,并使用该类的实例(如

)调用该方法
FORM

答案 1 :(得分:1)

我的回答是基于作者在该问题下的评论。

现在终于明白作者试图实现什么以及他做错了什么:)作者正在使用Quartz.NET来定期发送ZIP包。发送包后,作者想要更新用户WinForms应用程序内的文本框,其状态为“Congrats!ZIP已发送” 他显然无法理解的是延迟工作(特别是Quartz.NET)和.NET内存模型是如何工作的。

因此,作者有两种可能性:

  1. 在他的WinForms应用程序中运行Quartz.NET 。这是可能的,但不典型,因为它没有任何意义。
  2. 将Quartz.NET作为独立服务运行。这是典型用法。服务全天候运行,应用程序随时启动。
  3. 在第一种情况下我们只有一个Windows进程和AppDomain(显然,应用程序需要24x7全天候运行才能定期发送ZIP;延迟的作业不会被执行当app关闭时),因此两个对象实例之间的通信不是问题。现在让我们假设作者解决了作业序列化问题(例如,在执行之前保存作业,例如,在MongoDB中),Quartz.NET引擎可以获取Sync1表单对象的实例。他得到的结果是什么?究竟!他变得非常昂贵Task.Run(() => { });。自己编写简单的进程内调度程序要容易得多:)

    在第二种情况下 Quartz.NET作为独立服务运行(因此,在一台或两台不同的机器上运行两个Windows进程)。因为.NET非常好/坏,它不允许我们简单地从另一个进程引用一个对象,这就是为什么延迟作业从不能够更新作者的Sync1表单中的文本框的原因。这里提供的解决方案将创建Sync1类型的新实例,该实例与其WinForms应用程序中的实例无关。

    懒惰开发人员的摘要: @ G90将无法实现他想要的东西,因为它要么是针对Quartz.NET设计,要么针对.NET Framework。 为了让它按照自己的意愿工作,他将不得不设置Quartz.NET,就像第二种情况所描述的那样。然后,WinForms应用程序必须每隔几分钟查询一次作业状态,并自行更新Sync1表单。它很容易实现,Google和SO将帮助您找到示例。

答案 2 :(得分:0)

public class Job : IJob
{
    public Sync1 Sync{get;set;};

    public void Execute(IJobExecutionContext context)
    {
          if(Sync!=null)
              Sync.startSync();
    }
}

以及实例化作业时

...
var job=new Job{Sync=**yourSync1Instance**};
...

答案 3 :(得分:0)

如果您无法制作static class,则必须实施某种机制来共享Sync1的实例才能对其进行操作。
例如:

public static class SyncShare
{
    public static Sync1 Instance { get; set; }
}

现在,您必须以某种方式将Sync1个实例分配给SyncShare.Instance,以便您可以从任何其他class使用它。
请注意您的具体需求,因为上面的例子是一个非常基本的例子,没有任何额外的安全检查。

答案 4 :(得分:0)

由于您的Sync1表单不是staic,您需要首先获取它的实例。 请尝试以下方法:

public class Job : IJob
{
     public void Execute(IJobExecutionContext context)
     {
         MySync.Sync1 form = new MySync.Sync1();
         form.startSync();
     }
}