Передача данных обратно из внешнего dll с потоками - PullRequest
0 голосов
/ 13 мая 2009

У меня есть общая библиотека связи, которую я написал для связи с нашим оборудованием по 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();
        }

    }
}

Ответы [ 3 ]

0 голосов
/ 13 мая 2009

Как насчет создания события в классе Discover, и форма подписывается на событие, а не передает делегатов.

0 голосов
/ 13 мая 2009

Допустим, вы выполняете поиск, который приведет к 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());
    }
}
0 голосов
/ 13 мая 2009

Посмотрите на класс BackgroundWorker:

Обзор компонентов BackgroundWorker

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...