也许我在论坛上没有正确搜索,因为我没有发现类似的问题。
好吧,我的问题是当我尝试在thread
内执行async
方法。
当我运行方法 (Register)
没有thread
时,它可以很好地工作! 以下是场景的示例。
private SyncProcess _sync = new SyncProcess();
private static HttpClient _httpClient = new HttpClient();
private Thread _thread;
public class SyncProcess : ISyncProcess
{
public event CompleteHandler OnComplete = delegate { };
// another properties ...
public void Run()
{
// import rules
// ...
OnComplete();
}
}
public void TestImport()
{
Register(idsync, "start"); // here register works fine
_sync.OnComplete += ImportComplete;
_thread = new Thread(() =>
{
try
{
_sync.Run();
}
catch (Exception ex)
{
// not fall here
}
});
//
_thread.Start();
}
private void ImportComplete()
{
// other end-of-import rules
// ...
Register(idsync, "complete"); // here register not works
}
public async Task<string> Register(int idsync, string type)
{
string url = "myurl";
var stringContent = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("json", "myjson") });
var response = await _httpClient.PostAsync(url + type, stringContent);
if (response.IsSuccessStatusCode)
{
// do something
}
return "";
}
当我在线程内部调用方法 (Register)
时,问题发生了,另一件事是,它不会生成错误不会落入try
中,调试简单终止。我尝试在各处添加try
代码,但从未在catch
中崩溃。
调试总是在以下行中删除:
var response = await _httpClient.PostAsync(url + type, stringContent);
在这种情况下,我该怎么办?
更新了Register
方法中的代码返回字符串,但仍然存在相同的错误。
谢谢任何建议!
您的问题是由于使用async void
,应避免。它的问题之一是您无法使用try
/catch
。
C#中的事件处理程序是一种"燃烧"的语言功能。特别是,异步事件处理程序必须使用async void
,这意味着事件发布代码无法看到这些异常。如果要允许async
事件处理程序并从中处理异常(或其他结果),则可以使用"延期"解决方案或使您的事件处理程序代表返回Task
。
async void将不允许您捕获任何例外,并且在抛出时会终止您的应用程序。当使用任务而不是void时,仅观察并处理异常。
。您可以在此处阅读所有有关它的信息
我无法回答您的第一个问题,为什么没有线程而没有更多信息。我可以保证您认为据我所知,这与多线程无关,因为主线程也像其他任何线程一样。