Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在线程内调用异步方法_C#_Multithreading_Asynchronous - Fatal编程技术网

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);