等待列表中存在的项
本文关键字:存在 列表 等待 | 更新日期: 2023-09-27 17:49:30
我目前正在寻找一种方法来监控列表中要添加的项目(尽管它可能已经在列表中)具有一定的ID。下面的例子演示了我想要做的事情,但是我希望有一个更简洁的方法。
var list = new List<string>();
var task = new Task<bool>(() =>
{
for (int i = 0; i < 10; i++)
{
if (list.Contains("Woft"))
return true;
Thread.Sleep(1000);
}
return false;
});
如果有任何建议,我都将非常感谢,如果需要,我可以详细说明。
编辑:我不确定我会如何使用CollectionChanged
处理程序,仍然不确定我是否足够好地描述了这个问题,这里是一个更完整的例子。
class Program
{
private static List<string> receivedList = new List<string>();
static void Main(string[] args)
{
var thing = new item() { val = 1234, text = "Test" };
var message = new message() { id = "12", item = thing };
//This would be a message send
//in the receiver we would add the message id to the received list.
var task2 = new Task(() =>
{
Thread.Sleep(2000);
receivedList.Add(message.id);
});
task2.Start();
var result = EnsureReceived(thing, message.id);
if (result == null)
{
Console.WriteLine("Message not received!");
}
else
{
Console.WriteLine(result.text + " " + result.val);
}
Console.ReadLine();
}
//This checks if the message has been received
private static item EnsureReceived(item thing, string id)
{
var task = new Task<bool>(() =>
{
for (int i = 0; i < 10; i++)
{
if (receivedList.Contains(id))
return true;
Thread.Sleep(1000);
}
return false;
});
task.Start();
var result = task.Result;
return result ? thing : null;
}
}
class message
{
public string id { get; set; }
public item item { get; set; }
}
class item
{
public string text { get; set; }
public int val { get; set; }
}
听起来您想做的是使用ObservableCollection
并订阅CollectionChanged
事件。这样,每当修改集合时就会触发事件。这时,您可以检查集合是否有您期望的元素。
更好的是,CollectionChanged
事件处理程序将接收NotifyCollectionChangedEventArgs
,其中包含NewItems
属性。
您可以实现自己的类型,它拦截所有添加项和暴露ReadOnlyList
的操作。然后创建一个带有添加项目值的事件ItemAdded
(当添加一个集合时,您将不得不增加多个事件)。订阅,查看,做任何事