我知道以前已经回答了这个问题,但我被困住了。我有这门课,
public class Job : IJob
{
public void Execute(IJobExecutionContext context)
{
}
}
我想调用另一个类中的这个方法:
namespace MySync
{
public partial class Sync1 : Form
{
public void startSync()
{
// ...
如何访问startSync()
?使它成为static
无助于导致文本框等内部。
答案 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内存模型是如何工作的。
因此,作者有两种可能性:
在第一种情况下我们只有一个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();
}
}