c#异步对象

时间:2012-03-23 10:19:56

标签: c# multithreading asynchronous

我之前没有真正使用asyn操作或多线程,所以这对我来说都是新手。所以我希望得到一些指导

假设我有类似下面的课程

public class pinger
{


    // Constructor
    public Pinger()
    {
     do while exit = False;
    Uri url = new Uri("www.abhisheksur.com");
        string pingurl = string.Format("{0}", url.Host);
        string host = pingurl;
        bool result = false;
        Ping p = new Ping();
        try
        {
            PingReply reply = p.Send(host, 3000);
            if (reply.Status == IPStatus.Success)
                result = true;
        }
        catch { }
      //wait 2 seconds
      loop;
    }


}

所以我可以用

来调用它
Pinger firstone = new Pinger

我想要的是,如果控制然后返回主线程,让创建的实例运行并每两秒ping一次主机并更新结果变量,那么当我想知道来自的状态时,我可以使用get属性主线。

任何人都可以建议一些好的阅读/例子来介绍我在c#中的多线程,使用Ping作为一个例子看起来很容易尝试这个:)

干杯

亚伦

3 个答案:

答案 0 :(得分:3)

我会推荐任务并行库(TPL)。有关使用TPL的精彩文章可以找到here

有关C#中线程的其他信息,请访问Joseph Albahari's blog。这应该提供您开始所需的所有信息。

我希望这会有所帮助。

编辑:如果你想要一个如何解决上述问题的例子,我很乐意提供帮助。

答案 1 :(得分:3)

我可以概述课程的外观: - )

public class pinger
{
    private Uri m_theUri;
    private Thread m_pingThread;
    private ManualResetEvent m_pingThreadShouldStop;

    private volatile bool m_lastPingResult = false;

    public Pinger(Uri theUri)
    {
        m_theUri = theUri;
    }


    public void Start()
    {
        if (m_pingThread == null)
        {
            m_pingThreadShouldStop = new ManualResetEvent(false);
            m_pingThread = new Thread(new ParameterizedThreadStart(DoPing));
            m_pingThread.Start(m_theUri);
        }
    }

    public void Stop()
    {
        if (m_pingThread !=  null)
        {
            m_pingThreadShouldStop.Set();
            m_pingThread.Join();

            m_pingThreadShouldStop.Close();
        }
    }


    public void DoPing(object state)
    {
        Uri myUri = state as Uri;
        while (!m_pingThreadShouldStop.WaitOne(50))
        {
            // Get the result for the ping
            ...

            // Set the property
            m_lastPingResult = pingResult;
        }
    }


    public bool LastPingResult
    {
        get { return m_lastPingResult; }
    }
}

它做什么?这是一个使用StartStop方法的新类。 Start启动ping,Stop停止ping。

Ping在一个单独的线程中完成,每次ping都会更新result属性。

答案 2 :(得分:0)

我提出了一种基于Task的方法,其中有3个代码路径交互 - 请注意,很可能只使用一个线程完成工作。

下面显示的程序输出是:

enter image description here

public class Program
{
    public static object _o = new object();
    public static void Main(string[] args)
    {
        PingReply pingResult = null;
        int i = 0;
        Task.Run(async () =>
        {
            var ii = 0;
            //no error handling, example only
            //no cancelling, example only 
            var ping = new System.Net.NetworkInformation.Ping();
            while (true)
            {
                Console.WriteLine($"A: {ii} > {DateTime.Now.TimeOfDay}");
                var localPingResult = await ping.SendPingAsync("duckduckgo.com");
                Console.WriteLine($"A: {ii} < {DateTime.Now.TimeOfDay}, status: {localPingResult?.Status}");
                lock (_o)
                {
                    i = ii;
                    pingResult = localPingResult;
                }

                await Task.Delay(1000);
                ii++;
            }
        });

        Task.Run(async () =>
        {
            //no error handling, example only 
            while (true)
            {
                await Task.Delay(2000);
                lock (_o)
                {
                    Console.WriteLine($"B: Checking at {DateTime.Now.TimeOfDay}, status no {i}: {pingResult?.Status}");
                }
            }
        });

        Console.WriteLine("This is the end of Main()");
        Console.ReadLine();
    }
}