我之前没有真正使用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作为一个例子看起来很容易尝试这个:)
干杯
亚伦
答案 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; }
}
}
它做什么?这是一个使用Start
和Stop
方法的新类。 Start
启动ping,Stop
停止ping。
Ping在一个单独的线程中完成,每次ping都会更新result属性。
答案 2 :(得分:0)
我提出了一种基于Task
的方法,其中有3个代码路径交互 - 请注意,很可能只使用一个线程完成工作。
下面显示的程序输出是:
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();
}
}