Я создал одноэлементный веб-сервис WCF, который запускает фоновый поток все время, пока он размещается. Первый метод запускает функцию в фоновом потоке, которая проверяет общие данные, а другой обновляет эти данные. Это работало нормально и внезапно начало вести себя странно. Между тем не было никаких серьезных изменений в коде. Веб-служба WCF размещается на сервере Visual Studio Development Server, VS2008, 3.5, Win XP SP3, и то же самое происходит, если она размещена в Vista на IIS 7.
Вот упрощенный код
Услуги:
[ServiceContract]
public interface IService1
{
[OperationContract]
void Configure(XElement configuration);
[OperationContract]
void UpdateData(string data);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public partial class Service1 : IService1
{
List<string> stringCollection = new List<string>();
bool running;
Thread workerThread;
public void Configure(XElement configuration)
{
//add string elements to the stringCollection based on configuration
ParseConfiguration(); //implementation is irrelevant
//start background thread
workerThread = new Thread(WorkerFunction);
running = true;
workerThread.Start();
}
public void UpdateData(string data)
{
//adds string data to stringCollection
stringCollection.Add(data);
}
}
public partial class Service1 : IService1
{
private void WorkerFunction()
{
while(running)
{
//check stringCollection
Thread.Sleep(500);
}
}
}
Клиент:
//Configure() is called first and only once from client
Xelement configuration = Xelement.Load("configuration.xml");
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
client.Configure(configuration);
client.Close();
//UpdateData is called repeatedly from client
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
client.UpdateData("some string");
client.Close();
Во время отладки я заметил несколько вещей. После того, как Configure () запускает WorkerFunction () в новом потоке, поток остается активным в течение секунды или около того, в то время как WorkerFunction () имеет доступ к stringCollection, которая была настроена в Configure (). Когда клиент вызывает метод UpdateData () в первый раз, метод имеет пустую строку stringCollection (не содержащую данных, добавленных из метода Configure ()), как если бы он не использовался совместно, в то время как stringCollection сохраняет свои данные между каждым вызовом UpdateData (). Например:
//stringCollection after Configure()
{"aaa","bbb","ccc"}
//stringCollection after UpdateData("xxx")
{"xxx"}
//stringCollection after UpdateData("yyy")
{"xxx", "yyy"}
//after I run Client application again and call Configure()
//the data is preserved only here
{"xxx", "yyy","aaa", "bbb", "ccc"}
Если при отладке я susspend Thread с наивысшим приоритетом в окне Threads, тогда фоновый поток остается живым, как и предполагалось, но я получаю тот же результат, что и выше. WorkerFunction () имеет свой собственный экземпляр stringCollection, а UpdateData () - еще один. Я не знаю, что этот поток с наивысшим приоритетом имеет отношение к моему фоновому потоку, но, похоже, это плохо на него влияет. Предполагается, что сервис одноразовый, но он не действует как один.
Приветствия