我有一个通用的通讯库,我已编写通过TCP / IP与我们的硬件进行通信
公共库允许客户端应用程序和我们的工程师工具共享公共代码。 公共库运行需要将数据返回到表单的线程。
我有一些工作代码,但我觉得必须有一种更简单的方法。
这是我所拥有的简化版......
namespace EngineerTool
{
public delegate void DelegateSearchFinished();
public partial class MainForm : Form
{
public DelegateSearchFinished d_SearchFinished;
Discover discovery;
public MainForm()
{
InitializeComponent();
discovery = new Discover(this.FinishedSearchInvoke);
d_SearchFinished = new DelegateSearchFinished(this.FinishedSearch);
discovery.Start();
}
public void FinishedSearchInvoke()
{
this.Invoke(this.d_SearchFinished, new Object[] {});
}
public void FinishedSearch()
{
// Search has finished here!
}
}
}
namespace DiscoveryTool
{
public delegate void DelegateSearchFinished();
public class Discover
{
DelegateSearchFinished _callFinished;
public Discover(DelegateSearchFinished callFinished)
{
_callFinished = callFinished;
}
public void Start()
{
// starts thread and stuff
}
public void ThreadWorker()
{
_callFinished();
}
}
}
答案 0 :(得分:0)
看一下BackgroundWorker类:
答案 1 :(得分:0)
如何在Discover类上创建一个事件,Form会订阅该事件,而不是传递代理。
答案 2 :(得分:0)
假设您正在执行将导致List<Customer>
对象的搜索。一个相当直接和简单的方法是在搜索完成时使用带有结果的特殊EventArgs类来引发事件:
public class CustomerSearchEventArgs : EventArgs
{
public List<Customer> Customers { get; private set; }
public CustomerSearchEventArgs(List<Customer> customers)
{
Customers = customers;
}
}
...在搜索类中:
// the parameter is there to conform to the signature of the WaitDelegate
// used when invoking the method using the ThreadPool
public void Search(object state)
{
List<Customer> result = new List<Customer>();
// perform the search, populate the result list
// call a method to raise the event
OnSearchFinished(new CustomerSearchEventArgs(result));
}
protected void OnSearchFinished(CustomerSearchEventArgs e)
{
EventHandler<CustomerSearchEventArgs> searchFinished = this.SearchFinished;
if (searchFinished != null)
{
searchFinished(this, e);
}
}
......并采用以下形式:
private delegate void CustomerListHandler(List<Customer> customers);
private void StartSearch()
{
CustomerSearch search = new CustomerSearch();
search.SearchFinished += new EventHandler<CustomerSearchEventArgs>(Search_SearchFinished);
ThreadPool.QueueUserWorkItem(search.Search);
}
private void Search_SearchFinished(object sender, CustomerSearchEventArgs e)
{
SearchFinished(e.Customers);
}
private void SearchFinished(List<Customer> list)
{
if (this.InvokeRequired)
{
// the method is NOT executing on the UI thread; we
// need to invoke it on the right thread
this.Invoke(new CustomerListHandler(SearchFinished), list);
}
else
{
lstCustomers.Items.Clear();
lstCustomers.DisplayMember = "Name";
lstCustomers.Items.AddRange(list.ToArray());
}
}