持続的なタスクコードのいくつかのテスト
9565 ワード
using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace CallTest
{
public partial class Form1 : Form
{
private ConcurrentQueue<String> _Queue = new ConcurrentQueue<string>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//var c = new CallT();
//c.DoWork();
Thread t1=new Thread(()=>{OutQueue();});
t1.IsBackground = true;
t1.Start();
var arr = new List<Thread>();
for (int i = 0; i < 50; i++)
{
arr.Add( new Thread(() => { EnQueue(); }));
}
arr.ForEach((ent) => ent.Start());
}
private void EnQueue()
{
for (int i = 0; i < 1000; i++)
{
string msg = string.Format("Id:{0},Index:{1}",Thread.CurrentThread.ManagedThreadId,i);
_Queue.Enqueue(msg);
Thread.Sleep(10);
}
}
private void OutQueue()
{
int i = 0;
while (true)
{
if (_Queue.Count > 0)
{
i++;
string msg = null;
//Console.WriteLine(_Queue.Dequeue(); + " Count:" + i);// Queue
if (_Queue.TryDequeue(out msg))
{
Console.WriteLine(msg + " Count:" + i);
}
}
// Thread.Sleep(10);
}
}
}
public class CallT
{
private bool Enable { get; set; }
public CallT()
{
Enable = false;
}
private void _DoWork()
{
try
{
Thread.Sleep(100);
Console.WriteLine("TId:" + Thread.CurrentThread.ManagedThreadId);
}
catch (Exception ex)
{
}
finally
{
if (Enable)
{
//ThreadPool.QueueUserWorkItem((o) => {
// _DoWork();
//});
// Thead ThreadPool
System.Threading.Timer t = null;
using( t = new System.Threading.Timer((o) => { _DoWork(); }, null, 0, 0);
Thread.sleep(10);// timer
}
}
}
}
public void DoWork()
{
Enable = true;
_DoWork();
}
}
}
タスクの継続が必要な場合は、タスクの終了時に新しいスレッドを起動するか(ThreadPoolを使用)、新しいタイマで起動できます.