线程中的变量怎么传递到线程外

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程中的变量怎么传递到线程外相关的知识,希望对你有一定的参考价值。

参考技术A JMeter 变量作用域局限于所属线程。这样设计是经过深思熟虑的,目的是让测试线程能够独立运转。有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量。
  其中一种方法就是使用属性。属性为所有JMeter线程所共享,因此当某个线程设置一个属性后,其他线程就可以读取更新后的值。
  如果存在大量数据需要在线程间传递,那么可以考虑使用文件。例如,测试人员可以在一个线程中使用监听器,保存响应到文件(Save Responses to a file )或者 BeanShell PostProcessor 。而在另外一个线程中使用HTTP 采样器的“file: ”协议来读取文件,接着使用一个后置处理器或者BeanShell测试元件提取信息。
  如果在测试启动前测试人员就能获得测试数据,那么最好将数据保存到文件中,使用CSV Data set读取。

将数据从UI线程传递到c#中的另一个线程

如何将数据从主线程传递到在不同线程中连续运行的方法?我有一个计时器,其中值将连续递增,并且数据将在每个计时器tick事件的不同线程中传递给该方法。请帮忙。我对线程知识不多。

答案

您可以使用队列将数据发送到您锁定以进行访问的其他线程。这可确保最终处理发送到另一个线程的所有数据。您实际上并不需要将其视为“将”数据“发送”到其他线程,而是管理对共享数据的锁定,以便它们不会同时访问它(这可能会导致灾难!)

Queue<Data> _dataQueue = new Queue<Data>();

void OnTimer()
{
    //queue data for the other thread
    lock (_dataQueue)
    {
        _dataQueue.Enqueue(new Data());
    }
}

void ThreadMethod()
{
    while (_threadActive)
    {
        Data data=null;
        //if there is data from the other thread
        //remove it from the queue for processing
        lock (_dataQueue)
        {
            if (_dataQueue.Count > 0)
                data = _dataQueue.Dequeue();
        }

        //doing the processing after the lock is important if the processing takes
        //some time, otherwise the main thread will be blocked when trying to add
        //new data
        if (data != null)
            ProcessData(data);

        //don't delay if there is more data to process
        lock (_dataQueue)
        {
            if (_dataQueue.Count > 0)
                continue;
        }
        Thread.Sleep(100);
    }
}
另一答案

如果您使用的是Windows窗体,则可以执行以下操作:

在您的表单添加属性

private readonly System.Threading.SynchronizationContext context;
public System.Threading.SynchronizationContext Context
{
    get{ return this.context;}
}

在“表单”构造函数中设置属性

this.context= WindowsFormsSynchronizationContext.Current;

使用此属性将其作为构造函数参数传递给后台工作程序。这样您的工作人员就会了解您的GUI上下文。在后台工作程序中创建类似的属性。

private readonly System.Threading.SynchronizationContext context;
public System.Threading.SynchronizationContext Context
{
    get{ return this.context;}
}

public MyWorker(SynchronizationContext context)
{
    this.context = context;
}

更改您的Done()方法:

void Done()
{
    this.Context.Post(new SendOrPostCallback(DoneSynchronized), null);
}

void DoneSynchronized(object state)
{
    //place here code You now have in Done method.
}

在DoneSynchronized中您应始终在您的GUI线程中。

上面的答案完全来自这个帖子。重复标记。

Possible Duplicate

以上是关于线程中的变量怎么传递到线程外的主要内容,如果未能解决你的问题,请参考以下文章

怎样将子线程中的参数传到主线程

java中开启子线程后主线程中传入的变量不变

java中的volatile变量

跨线程传递栈变量带来异常指针Crash

线程变量ThreadLocal的使用

看了这篇文章,你还敢说你了解volatile关键字吗?