C#在线程内调用异步方法
也许我没有在论坛中正确搜索,因为我没有发现类似的问题C#在线程内调用异步方法,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,也许我没有在论坛中正确搜索,因为我没有发现类似的问题 好吧,我的问题是当我试图在线程中执行异步方法时 当我在没有线程的情况下运行方法(Register)时,它工作得非常好! 下面是该场景的一个示例 private SyncProcess _sync = new SyncProcess(); private static HttpClient _httpClient = new HttpClient(); private Thread _thread; public class SyncProc
好吧,我的问题是当我试图在
线程
中执行异步
方法时
当我在没有线程的情况下运行方法(Register)
时,它工作得非常好!
下面是该场景的一个示例
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 "";
}
在这种情况下我该怎么办?
更新了寄存器
方法中的代码返回字符串,但仍然存在相同的错误。
谢谢你的建议!
异步void将不允许您捕获任何异常,并在抛出异常时终止应用程序。当使用task而不是void时,异常仅作为正常异常进行观察和处理
你可以在这里读到这一切
如果没有更多的信息,我无法回答你的第一个问题,即为什么它没有线程就可以工作。我可以向你保证,据我所知,它与多线程无关,因为主线程和其他线程一样也是一个线程 Async void将不允许捕获任何异常,并在抛出异常时终止应用程序。当使用task而不是void时,异常仅作为正常异常进行观察和处理
你可以在这里读到这一切
如果没有更多的信息,我无法回答你的第一个问题,即为什么它没有线程就可以工作。我可以向你保证,据我所知,它与多线程无关,因为主线程和其他线程一样也是一个线程 您的问题是由于使用了异步void
。它的一个问题是不能使用try
/catch
捕获异常
C#中的事件处理程序是一种“触发并忘记”的语言特性。特别是,异步事件处理程序必须使用async void
,这意味着事件发布代码无法看到这些异常。如果要允许async
事件处理程序并处理来自它们的异常(或其他结果),可以使用或使事件处理程序委托返回任务。您的问题是由于使用了async void
。它的一个问题是不能使用try
/catch
捕获异常
C#中的事件处理程序是一种“触发并忘记”的语言特性。特别是,异步事件处理程序必须使用async void
,这意味着事件发布代码无法看到这些异常。如果要允许async
事件处理程序并处理来自它们的异常(或其他结果),可以使用或使事件处理程序委托返回Task
。您使用的是async void。可能是应用程序在完成执行之前就死了吗?@Vlad,我们不需要验证返回,只是为了执行http
请求,返回并不重要!希望看到一个样本项目,重新创建的问题,这样我可以改善我的答案。你能提供一个简单的答案吗?我希望能够在控制台应用程序中复制、粘贴和运行您的代码,并查看您遇到的问题。@Enigmativity,我试图在简化的环境中重现错误。但是,在极简主义环境中,不会发生错误。您正在使用异步void。可能是应用程序在完成执行之前就死了吗?@Vlad,我们不需要验证返回,只是为了执行http
请求,返回并不重要!希望看到一个样本项目,重新创建的问题,这样我可以改善我的答案。你能提供一个简单的答案吗?我希望能够在控制台应用程序中复制、粘贴和运行您的代码,并查看您遇到的问题。@Enigmativity,我试图在简化的环境中重现错误。但是,在极简主义环境中,不会发生错误。
var response = await _httpClient.PostAsync(url + type, stringContent);