c#调用异步方法内部线程



也许我在论坛上没有正确搜索,因为我没有发现类似的问题。
好吧,我的问题是当我尝试在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时,仅观察并处理异常。

您可以在此处阅读所有有关它的信息

我无法回答您的第一个问题,为什么没有线程而没有更多信息。我可以保证您认为据我所知,这与多线程无关,因为主线程也像其他任何线程一样。

最新更新