gpt4 book ai didi

c# - 为什么使用wcf托管在另一个线程上时,为什么总是总是更改线程ID?

转载 作者:行者123 更新时间:2023-12-03 13:21:30 29 4
gpt4 key购买 nike

在我的应用程序中,我主持一个WCF服务:

private void StartService()
{
m_serviceHost = new ServiceHost(typeof(...));
m_serviceHost.Open();
}

private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(StartService);
t.IsBackground = true;
t.Start();
// ...
}

服务本身只有一种方法:
public void SendMessage(string message)
{
MessageBox.Show(String.Format("Message '{0}' received on thread {1} : MessageLoop =
{2}", message, Thread.CurrentThread.GetHashCode(), Application.MessageLoop),
"MessagingService.SendMessage()");
}

当客户端调用此操作时,我得到以下响应:
Message 'hello client : message 9 recieved on thread **12**
Message 'hello client : message 9 recieved on thread **15**
Message 'hello client : message 9 recieved on thread **17**
...

为什么线程ID总是更改?当我创建ServiceHost时,我只将他放在了另一个线程上! 我不会每次都将他重新置于另一个线程上... 仅一次

我如何才能将主机放在另一个线程中(就像我一样)并仅获取单个后台线程ID?

最佳答案

IIRC正确地表示ConcurrencyMode.Single不保证使用单个线程...它保证仅单个线程可以访问服务实例...从而防止了两个(或多个)线程使用相同线程时可能出现的并发问题服务实例(例如,状态可能会损坏)。

我猜您想强制执行一个线程来处理所有调用,以便一切都按顺序完成,并且不会损坏任何状态。但是,使用默认的InstanceContextMode(PerCall),无论如何,每个调用都会获得自己的服务实例。并将ConcurrencyMode设置为single时,您可以确保只有一个线程可以访问服务实例。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, 
InstanceContextMode = InstanceContextMode.PerCall)]
public class MessageService : IMessageService
{
public string ReturnMessage()
{
return String.Format("Thread {0}", Thread.CurrentThread.ManagedThreadId);
}
}

关于c# - 为什么使用wcf托管在另一个线程上时,为什么总是总是更改线程ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7453700/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com