我创建了一个类库,它有一个查询开放端口的方法,在某些情况下最多可能需要3秒才能完成。如果我在一个单独的线程中实现它,这将在我的类方法中处理,还是由最高实体完成,例如主窗体?
您能否提供在类内部处理线程的示例?
[编辑]
这是有问题的方法。
public void QueryOpenPorts(out string[] portNames, out bool[] isOpen)
{
// get valid ports on computer
portNames = QueryPortNames();
// number of ports
int count = portNames.Length;
// initialise isOpen array
isOpen = new bool[count];
// iterate through ports and test connection
for (int i = 0; i < count; i++)
{
using (SerialPort serialPort = new SerialPort(portNames[i]))
{
serialPort.Open();
// port is available
isOpen[i] = true;
}
}
}
答案 0 :(得分:1)
在架构上,我将从主窗体创建一个调用类库的线程。谁知道,也许其他一些调用你的库的类不需要调用就可以进入一个线程。
在我的主要课程中,我有类似的东西:
this._checkSessionTimer = new Timer(intTimer * 2000);
this._checkSessionTimer.Elapsed += (o, e) => CheckSessions();
然后CheckSessions会打电话给他们所需的一切。
我还使用后台工作人员完成我需要长时间延迟使用Web服务器的工作:
BackgroundWorker linkWorker = new BackgroundWorker();
linkWorker.DoWork += (o, e) =>
{
...
};
linkWorker.RunWorkerAsync();
我的工作者DoWork中的匿名函数实际上使用我的Web服务包装器来进行Web服务调用。
然而,在做这样的事情之前,我真的建议你给这个读一读:
http://www.albahari.com/threading/
答案 1 :(得分:1)
我很少在同一个类中处理多线程代码。尽可能尝试使用外部库,因为这将允许您使用不同的异步方式来调用它(而不仅仅是通过多个线程)。
例如,假设我有一个DownloadHtmlToString(string url)方法。通常,此方法将获取该URL,转到Web,然后将该信息保存到字符串并返回它。
通过在外部库/类/模块/等中使用它。你允许自己同步,异步和多个线程/任务调用它,而无需编辑主要功能。关键是使DownloadHtmlToString()方法是线程安全的。
我养成了使线程安全的习惯,即使它们最初并不打算因为将来的维护而被异步调用。谁知道,未来我们可能在未来5年内拥有256核机器,但我的代码仍然需要在企业环境中运行,并且能够使用新硬件进行扩展。
答案 2 :(得分:0)
在班级内创建新主题。
创建线程与其他主题一样,应该在面向对象的规则下完成。 Encapsulation
规定我们隐藏其中对象的功能。
I/O
操作(如network操作)就是我们需要阻塞和非阻塞方法的好例子。
如果此类仅在win-form应用程序中使用,请将其标记为STA
,并防止以不安全的方式通过多个线程共享它。