我在使用HttpClient发送http请求时遇到间歇性死锁,有时它们永远不会返回到await SendAsync我的代码中.我能够找出处理内部请求的线程HttpClient/ HttpClientHandler由于某种原因SynchronizationContext它在死锁期间有一个.我想弄清楚如何使用线程最终得到a SynchronizationContext,通常他们没有.我会假设无论什么对象导致SynchronizationContext设置它也会阻塞Thread,这会导致死锁.
我是否能够在TPL ETW事件中看到任何相关内容?
我该如何解决这个问题?
编辑2:
我注意到这些死锁的地方是在ServiceContractwindows服务中的wcf (参见下面的代码)中.该SynchronizationContext所导致的问题实际上是一个是WindowsFormsSynchronizationContext,我以为是一些控制入门创建并造成没有清理正确(或者类似).我意识到几乎可以肯定不应该在Windows服务中发生任何Windows窗体的事情,我并不是说我同意它是如何使用的.但是,我没有使用它编写任何代码,我不能轻易地改变所有的引用.
编辑:这是我遇到问题的wcf服务的一般概念的一个例子.这是一个简化版本,而不是确切的代码:
[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
internal class SampleWcfService
{
private readonly HttpMessageInvoker _invoker;
public SampleWcfService(HttpMessageInvoker invoker)
{
_invoker = invoker;
}
[WebGet(UriTemplate = "*")]
[OperationContract(AsyncPattern = true)]
public async Task<Message> GetAsync()
{
var context = WebOperationContext.Current;
using (var request = CreateNewRequestFromContext(context))
{
var response = await …Run Code Online (Sandbox Code Playgroud) .net c# synchronizationcontext task-parallel-library async-await
是否有一种标准方法可以让场景 1 因未指定已知属性而出现编译错误,就像场景 2 中一样?或者有一些解决方法吗?
class Class2 {
g: number;
}
class Testing {
static testIt3<T>(val: Partial<T>): void {
}
}
const test = {
g: 6,
a: '6',
};
// Scenario 1
Testing.testIt3<Class2>(test);
// TS does not show any errors for this scenario
// Scenario 2
Testing.testIt3<Class2>({
g: 6,
a: '6',
});
// but it does for this scenario:
// Object literal may only specify known properties...
Run Code Online (Sandbox Code Playgroud)
我发现了许多关于如何设置模块增强文件以向 node_module 添加功能的示例,但我对如何将它们包含在打字稿编译中有点困惑。我是否应该像这样导入在顶部main.ts(或public_api.ts库)进行增强的文件:
import './moduleaugmentationfile';
Run Code Online (Sandbox Code Playgroud)
或者是否有其他标准方法可以使此附加功能在整个应用程序中可用。
编辑:
这是一个示例应用程序。示例模块增强位于moduleaugmentation.ts. 我在 中添加了一条评论main.ts,解释了我对如何最好地包含模块增强的困惑。