如何创建一个Thread,它将具有一个可以从另一个类读取的字段

时间:2012-11-14 15:50:19

标签: c# multithreading

我想在C#中创建一个Thread,它将计算计算机麦克风输入端的声音频率。我不是在询问FFT算法,而是如何启动一个线程,所以我可以在Thread.hz改变时修改A.hz字段。

只有1个帖子。

public class A()
{
    Thread t;
    int hz;  <-- i would like to change this when

    A()
    {
        starts Thread
        onchange t.hz modifies and dispays this.hz
    }        
}

class Thread
{
    int hz; <-- this changes

    void computeFrequency() <-- because of that method
    {
        changesHZField...
    }
}

3 个答案:

答案 0 :(得分:2)

正如所承诺的,这是使用Rx的解决方案:

using System;
using System.Reactive.Concurrency;
using System.Reactive.Linq;

namespace rxtest
{
    class FrequencyMeter
    {
        Random rand = new Random();
        public int Hz
        {
            get
            {
                return 60+rand.Next(3);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var obs = Observable.Generate<FrequencyMeter, int>(
                new FrequencyMeter(), //state
                x => !Console.KeyAvailable, // while no key is pressed
                x => x, // no change in the state
                x => x.Hz, // how to get the value
                x => TimeSpan.FromMilliseconds(250), //how often
                Scheduler.Default)
                .DistinctUntilChanged() //show only when changed
                ;

            using (IDisposable handle = obs.Subscribe(x => Console.WriteLine(x)))
            {
                var ticks = Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(x=>Console.WriteLine("tick")); //an example only
                Console.WriteLine("Interrupt with a keypress");
                Console.ReadKey();
            }
        }
    }
}

异步传递值:

Interrupt with a keypress
60
61
tick
62
60
tick
61
60
tick
62
61
tick
62
60
tick

答案 1 :(得分:1)

您无需执行任何特殊操作 - 多个线程将能够访问您的hz字段。您需要考虑同步问题(http://msdn.microsoft.com/en-us/library/ms173179.aspx)

当你有多个线程读/写同一个变量时,会出现各种各样的问题。最简单的事情可能是遵循链接并复制他们的锁定方法。

答案 2 :(得分:0)

public class A()
{
    Thread t;
    int hz;

    A()
    {
        //starts Thread
    }

    internal void Signal(int hz){
        //modifies and dispays this.hz
    }

}

现在Thread类可以在每次设置属性时调用方法Signal。 要引用A类实例,您可以将其传递给Thread类构造函数并将引用存储为私有变量,或者将A本身声明为static;这取决于您的整体架构。

class MyThread : Thread
{
    int _hz;
    A _instance;

    public void MyThread(A inst){
        _instance = inst;
    }

    void computeFrequency()
    {
        //changesHZField...
        _instance.Signal(_hz);
    }
}

最后,您可能需要启用跨线程操作,具体取决于您在A类和MyThread类中执行的操作