读书人

Threading.Timer线程停止现象解析

发布时间: 2013-07-11 15:38:46 作者: rapoo

Threading.Timer线程终止现象解析
我有一个WCF服务方法调用一个集合的ADD方法代码如下


[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class BookService : IBookService
{
public void AddBook(Book book)
{
WcfServiceLibrary1.ServiceHelp.BookList.AddBook(book);
}
}


这个BOOKLIST的代码如下

public class BookList
{
private static List<Book> _list = null;

public BookList()
{
_initializerList();
}

private void _initializerList()
{
if (_list == null)
{
_list = new List<Book>();
for (int i = 0; i < 10; i++)
{
_list.Add(new Book() { BookName = "C#" + i, BookNO = Guid.NewGuid(), BookPrice = 10 * i , NeedShow=true});
}
}
}

/// <summary>


/// 提供给WCF,以此获取新的实例
/// </summary>
/// <param name="item"></param>
public static void AddBook(Book book)
{
var temp = _list.Find(p => { return p.BookNO == book.BookNO; });

if (temp == null)
{
/*初始化一个新的对象*/
lock (_list)
{
_list.Add(book);
Console.WriteLine("编号{0}的书本添加成功", book.BookNO);
}
}
}

public List<Book> GetBookList()
{
return _list;
}
}


现在有个定时器(Threading.Timer)调用
   /// <summary>
/// 服务启动
/// </summary>
public void OnSatrt()
{
_msq = new BookList();


//int interval = 1000;
double interval = 5000;
Timer timer = new Timer(new TimerCallback(timer_Elapsed), null, 0, 1000);//timer_Elapsed, null, 0, 1000);

//double interval = 5000;
//Timer timer = new Timer(interval);
//timer.Elapsed += timer_Elapsed;// new ElapsedEventHandler(timer_Elapsed);
//timer.AutoReset = true;
//timer.Enabled = true;
}

//void timer_Elapsed(object sender, ElapsedEventArgs e)
//{
// throw new NotImplementedException();
//}

void timer_Elapsed(object sender)
{
var list = _msq.GetBookList().FindAll(p => { return p.NeedShow; });
Console.WriteLine("=============={0}:线程名{1}执行数据量{2}=============", DateTime.Now.ToString("HH:mm:ss"), Thread.CurrentThread.Name, list.Count);
list.ForEach(p =>
{
p.NeedShow = false;
Console.WriteLine(p.BookName);
});
}


当外部程序引用WCF中的ADD方法时,定时器中的回调会出现线程卡死的情况,望解析 多线程 WCF?

分享到:
[解决办法]
Timer timer可能被注销,实例一个全局 Timer timer

读书人网 >C#

热点推荐