试图从另一个 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 内存模型的工作原理。
所以,作者有两种可能:
- 运行 Quartz.NET 在他的 WinForms 应用程序中 。可能但不典型,因为它没有任何意义。
- 运行 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 将帮助您找到示例。
我知道之前已经回答过这个问题,但我卡住了。我有这个 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 内存模型的工作原理。
所以,作者有两种可能:
- 运行 Quartz.NET 在他的 WinForms 应用程序中 。可能但不典型,因为它没有任何意义。
- 运行 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 将帮助您找到示例。