【问题标题】:Returning value by a thread通过线程返回值
【发布时间】:2017-07-01 15:28:07
【问题描述】:

有这个:

public Item_DataColl invoke_command_READ(string UCPTName)
{
    networkingThread = new Thread(new ParameterizedThreadStart(thread_command_READ));
    networkingThread.Start(new readingThreadParameter(UCPTName));
}
private Item_DataColl thread_command_READ_result(object parameter)
{
    readingThreadParameter p = parameter as readingThreadParameter;
    Item item;

    if (p.UCPT_Name != null)
    {
        Item_DataColl resultSet;
        try
        {
            OnProgressBarUpdate(progressBar.UnknownEnd);
            resultSet = connector.command_READ(p.UCPT_Name);
            readOperationDone(resultSet);
            OnConsoleWriting(string.Format("[READING] Lecture réussie : {0} = {1}", ((Dp_Data)resultSet.Item[0]).UCPTname, ((Dp_Data)resultSet.Item[0]).UCPTvalue[0].Value), ILonConnectorConsoleResultType.RESULT);
            return resultSet; // HERE, I WANT TO RETURN RESULT
        }
        catch (Exception e)
        {
            OnConsoleWriting(e.ToString(), ILonConnectorConsoleResultType.ERROR);
        }
        finally
        {
            OnProgressBarUpdate(progressBar.Invisible);
        }
    }
}

我正在尝试执行 SOAP 请求并发送结果。为了使应用程序“非阻塞”,我使用了 Thread。

soap 请求完美运行,但我无法在线程结束后发送结果。我必须跟踪它,当线程结束时,将结果发送回另一个类。

我该怎么做?

【问题讨论】:

  • 你有没有考虑过使用任务——因为它们很容易在最后返回值
  • 使用Tasks 或async/await 或回调方法,这取决于您没有向我们展示的架构
  • 是的,我认为 Task 可能是一个很好的解决方案,你能通过一个例子告诉我我需要如何执行这个吗?

标签: c# .net multithreading return


【解决方案1】:

嗯.. 这个解决方案可以写得更好.. 但我目前正在使用您已经发布的代码。

方法 - 使用回调(带有委托):

首先 - 在你的类范围内声明一个委托

private Action<Item_DataColl> OnResultSetComplete;

第二 - 在调用你的线程之前为委托分配一些函数

public Item_DataColl invoke_command_READ(string UCPTName)
    {
        OnResultSetComplete = (resukts) =>
        {
             // DO SOMETHING HERE
        };
        networkingThread = new Thread(new ParameterizedThreadStart(thread_command_READ));
        networkingThread.Start(new readingThreadParameter(UCPTName));
    }

最后 - 改变你的阅读结果功能:

private Item_DataColl thread_command_READ_result(object parameter)
    {
        readingThreadParameter p = parameter as readingThreadParameter;
        Item item;

        if (p.UCPT_Name != null)
        {
            Item_DataColl resultSet;
            try
            {
                OnProgressBarUpdate(progressBar.UnknownEnd);
                resultSet = connector.command_READ(p.UCPT_Name);
                readOperationDone(resultSet);
                OnConsoleWriting(string.Format("[READING] Lecture réussie : {0} = {1}", ((Dp_Data)resultSet.Item[0]).UCPTname, ((Dp_Data)resultSet.Item[0]).UCPTvalue[0].Value), ILonConnectorConsoleResultType.RESULT);
                if (OnResultSetComplete != null) OnResultSetComplete(resultSet); 
            }
            catch (Exception e)
            {
                OnConsoleWriting(e.ToString(), ILonConnectorConsoleResultType.ERROR);
            }
            finally
            {
                OnProgressBarUpdate(progressBar.Invisible);
            }
        }
    }

【讨论】:

  • 您为什么不使用await 或任务?
  • 问题是关于 threads。- 旧时尚方式.. 当有人问问题时,我首先 - 回答原始问题,然后才 - 尝试提出改进建议.. . 但由于我被否决了,我真的不想在这个问题上打扰自己
猜你喜欢
  • 1970-01-01
  • 2018-09-11
  • 2013-11-06
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多