我希望可能有一个简单的解决方法,但我看不到。
我正在尝试从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/