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

Trying to call a method in Form from another class

我知道之前已经回答过这个问题,但我卡住了。我有这个 class,

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

    }
}

我想调用另一个 class:

中的这个方法
namespace MySync
{
  public partial class Sync1 : Form
  {
      public void startSync()
      {
         // ...

如何访问 startSync()?使其成为 static 并没有帮助,因为里面有文本框等。

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**};
...

如果您不能创建 static class,则必须实施某种机制来共享 Sync1 的实例以便能够对其进行操作。
例如:

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

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

由于您的 Sync1 表单不是 staic您需要先获取它的实例。 尝试以下操作:

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

您的 startSync 方法包含在 class Sync 中,后者是 FORM。您宁愿在单独的 class 中重构和提取该方法,并使用 class 的实例调用它,例如

public class Syncclass
{
      public void startSync()
      { 
            // your staff here
      }           
}


public class Job : IJob
{
   private Syncclass sync = null;
    public void Execute(IJobExecutionContext context)
    {
      sync.startSync();
    }

public Job()
{
  sync = new Syncclass();
}
}

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

现在终于清楚作者试图实现什么以及他做错了什么:)作者正在使用 Quartz.NET 定期发送 ZIP 包。发送包后,作者想更新用户 WinForms 应用程序中的文本框,状态如 "Congrats! ZIP was sent" 他显然无法理解延迟作业(特别是 Quartz.NET)和 .NET 内存模型的工作原理。

所以,作者有两种可能:

  1. 运行 Quartz.NET 在他的 WinForms 应用程序中 。可能但不典型,因为它没有任何意义。
  2. 运行 Quartz.NET 作为独立服务。这是典型的用法。服务 运行 24x7,应用程序在需要时启动。

第一种情况 我们只有一个 windows 进程和 AppDomain(显然,应用程序需要 运行 24x7能够定期发送 ZIP;应用程序关闭时不会执行延迟作业),因此两个对象实例之间的通信不是问题。现在假设作者解决了作业序列化问题(例如,作业在执行前保存在 MongoDB 中)并且 Quartz.NET 引擎可以获取 Sync1 表单对象的实例。他得到什么结果?确切地!他变得非常昂贵 Task.Run(() => { });。自己写一个简单的进程内调度器会容易很多:)

第二种情况 Quartz.NET 运行作为独立服务(因此,两个 windows 进程在一台或两台不同的机器上)。因为 .NET 是如此 good/bad 它不允许我们简单地从另一个进程引用对象,这就是为什么延迟作业将 永远 无法更新作者的 Sync1 中的文本框形式。此处提供的解决方案将创建与他的 WinForms 应用程序中的实例无关的 Sync1 类型的新实例。

懒惰开发者总结: @G90 将无法实现他想要的,因为它要么违反了 Quartz.NET 设计,要么违反了 .NET Framework。 为了让它按他想要的方式工作,他将必须设置 Quartz.NET 就像在第二种情况下描述的那样。然后 WinForms 应用程序将不得不每隔几分钟查询一次作业状态并自行更新 Sync1 表单。它很容易实现,Google 并且 SO 将帮助您找到示例。