Синглтон веб-службы WCF - странное поведение - PullRequest
2 голосов
/ 27 мая 2011

Я создал одноэлементный веб-сервис 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 () - еще один. Я не знаю, что этот поток с наивысшим приоритетом имеет отношение к моему фоновому потоку, но, похоже, это плохо на него влияет. Предполагается, что сервис одноразовый, но он не действует как один.

Приветствия

1 Ответ

0 голосов
/ 31 мая 2011

Рад видеть, что ваша проблема исправлена.

Тем не менее, я думаю, что вы должны немного взглянуть на свой код, он кажется более сложным, чем нужно.

Вы используете Singleton, но каждый вызов Singleton создает новый поток.

Почему бы не сделать это без синглтона и позволить IIS обрабатывать потоки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...