我希望可能有一个简单的解决方法,但我看不到。

我正在尝试从C#控制台程序将数据插入到Azure移动服务数据库中。但是,当从VS内部(通过F5)运行程序时,在正常运行程序期间不会插入数据,也不会抛出异常(我可以看到)。当我将断点设置为await dataModel.InsertAsync(data)行并在立即窗口中运行该断点时,它将引发ThreadAbortException。任何帮助表示赞赏。

Namespace TestApp {
class Program
{
    public static MobileServiceClient MobileService = new MobileServiceClient(
    "https://x.azure-mobile.net/",
    "API key");

    public static IMobileServiceTable<performance> dataModel = Program.MobileService.GetTable<performance>();

    static void Main(string[] args)
    {
        try
        {
            var test = new performance("http://www.example.com");
            var x = InsertItem(test);
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.StackTrace);
        }
    }
static public async Task InsertItem(performance data)
{
        await dataModel.InsertAsync(data).ConfigureAwait(false);
}
}

class performance
{
    [JsonProperty(PropertyName = "id")]
    string Id { get; set; }
    [JsonProperty(PropertyName = "uri")]
    string Uri { get; set; }

    public performance(string uri)
    {
        Uri = uri;
    }

}
}

最佳答案

我创建了一个小测试来(某种程度上)模拟您在做什么。当在InsertItem中等待的任务花费很少或根本没有时间时,由var x = InsertItem(test)行返回的任务将返回RanToCompletion状态的任务,并且调试器将按预期方式工作。

但是,当我使等待的任务执行实质性的操作(例如Thread.Sleep(5000))时,我得到了您正在描述的行为,并且var x = InsertItem(test)行返回的任务在WaitingForActivation中返回了一个任务州。

当我将Task.WaitAll(x)放在var x = InsertItem(test)行之后时,我得到了我认为我们都期望的行为,而x.Status是RanToCompletion。

关于c# - 从静态函数调用InsertAsync会引发ThreadAbortException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24152298/

10-13 03:15