小编jok*_*efe的帖子

如何等待在WinRT中使用反射调用的异步私有方法?

我正在为WinRT应用程序编写单元测试,并且我能够使用以下方法调用非异步私有方法:

TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
       .GetDeclaredMethod("ThePrivateMethod")
       .Invoke(theObject, null);
Run Code Online (Sandbox Code Playgroud)

但是,如果有问题的私有方法是async,代码将继续执行而不等待它完成.

如何await为此添加功能?

c# reflection async-await windows-runtime

58
推荐指数
2
解决办法
2万
查看次数

调用等待GetFileAsync()永远不会返回,应用程序在WinRT应用程序中挂起

我试图在应用程序启动时加载和读取设置文件,大约90%的时间,await GetFileAsync("filename.xml");永远不会返回,因此,挂起应用程序.

大约四分之一的时间,如果我单步执行代码,它实际上将返回并读取文件.

这是代码的一个非常简化的版本:

App.xaml.cs:

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    FileLoader.Load().Wait();

    // File-load dependent stuff
}
Run Code Online (Sandbox Code Playgroud)

FileLoader.cs:

public async static Task Load()
{
    StorageFolder folder = ApplicationData.Current.LocalFolder;
    StorageFile file;
    bool fileExists = true;

    try
    {
        // The following line (often) never returns
        file = await folder.GetFileAsync("filename.xml");
    {
    catch
    {
        fileExists = false;
    }

    // Do stuff with loaded file
}
Run Code Online (Sandbox Code Playgroud)

如果我在Visual Studio中观看"输出"窗口,经过一段时间的等待,我得到了 "The thread '<No Name>' (0x30c) has exited with code 0 (0x0)."

有没有人知道这里发生了什么?

c# file-io async-await windows-8 windows-runtime

26
推荐指数
1
解决办法
1万
查看次数

如何禁用Windows 8/WinRT AppBar?

我的目标是在某种情况下只提供AppBar.我试图通过创建一个AppBar来实现这一目标,但在这种情况出现之前将其禁用.但是,如果您将IsEnabledAppBar上的属性设置为False,当您启动应用程序并右键单击(通常会打开AppBar)时,应用程序崩溃.这是框架中的错误吗?禁用AppBar的正确方法是什么?

编辑:这也是当你设置发生VisibilityCollapsed.

更多信息:我通过Visual Studio调试器运行它,但是弹出一个单独的"Visual Studio即时调试器"窗口,其中显示消息"App.exe [2596]中发生了未处理的win32异常".弹出一个警告框,上面写着"调试器附加到App.exe但未配置为调试此未处理的异常.要调试此异常,请分离当前的调试器."

编辑2:这不仅仅是我的代码.如果您只是添加IsEnabled="False"到Microsoft自己的示例AppBarControl项目中的AppBar,它也会崩溃(可在此处找到:http://code.msdn.microsoft.com/windowsapps/XAML-AppBar-control-sample-2aa1cbb4 )

编辑3:@G.Andrew Duthie - devhammer提供了我正在使用的答案.我只是想补充一点,我发现最好用this.BottomAppBar = null它来禁用它,而不是设置IsEnabledVisibility属性.如果您只是设置VisibilityCollapsed,那么当您右键单击时,应用程序仍然认为AppBar存在,即使它不可见,因此您的下一个常规点击将被解释为通常关闭AppBar的点击,因此您将必须再次单击才能实际执行您尝试的操作.

c# microsoft-metro windows-8 windows-runtime winrt-xaml

11
推荐指数
1
解决办法
7366
查看次数

如何在Metro/WinRT中绑定嵌套的ListView ItemTemplates数据?

在我的ViewModel中,我有一组对象,每个对象都包含另一个集合.我试图通过使用嵌套的ListView ItemTemplates在我的视图中显示它.这是我的ViewModel代码的简化:

public ViewModelObject
{
    public ObservableCollection<OuterObject> OuterCollection { get; }
}

public OuterObject
{
    public string OuterTitle;
    public ObservableCollection<InnerObject> InnerCollection { get; }
}

public InnerObject
{
    public string InnerTitle;
}
Run Code Online (Sandbox Code Playgroud)

以下是我在XAML中尝试使用此ViewModel的简化方法:

<ListView ItemsSource="{Binding OuterCollection}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding OuterTitle}"/>
                <ListView ItemsSource="{Binding InnerCollection}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding InnerTitle}"/>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
Run Code Online (Sandbox Code Playgroud)

如果我删除内部ListView,外部ListView绑定完全正常.我只是无法弄清楚如何将内部集合对象正确绑定到内部ListView.我已经尝试用{Binding OuterCollection.InnerCollection},{Binding DataContext.InnerCollection}{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection},做内部绑定,但所有这些导致它崩溃.实现此嵌套绑定的正确方法是什么?

编辑:我应该补充一点,这是一个从Windows Phone 7移植的应用程序,它是一个尝试找到替代品LongListSelector,这在WinRT中不可用.

c# data-binding microsoft-metro windows-runtime winrt-xaml

7
推荐指数
1
解决办法
8749
查看次数

将X轴标签与图表列对齐(ASP.Net图表控件)

我正在尝试使用ASP.Net Chart控件创建一个图表,该控件在X轴上具有特定的数值,在Y轴上具有它们的频率计数.这是我想要替换的图表框架的一个例子:

在此输入图像描述

在上面的示例中,X轴标签与列对齐.但是,使用ASP.Net Chart控件,而不是标记代表这些特定值的列(例如1492,2984),控件是以圆形间隔标记而不是与列排列(例如2000,4000),因为您可以见下文:

在此输入图像描述

我发现其他类似的帖子建议将其设置ChartArea.AxisX.Interval为1.我试过了,但是X轴标签因某种原因消失了,如下所示:

在此输入图像描述

这是我用来创建和填充图表的代码(减去设置各种颜色属性):

DataTable newDt = GetChartDataTable();
chart.DataSource = newDt;
chart.Series.Add("Series1");
chart.Series["Series1"].YValueMembers = "Frequency";
chart.Series["Series1"].XValueMember = "RoundedValue";
chart.ChartAreas["ChartArea1"].AxisX.Title = "kbps";
chart.ChartAreas["ChartArea1"].AxisX.TitleFont = new Font("Sans Serif", 10, FontStyle.Bold);
chart.ChartAreas["ChartArea1"].AxisY.Title = "Frequency";
chart.ChartAreas["ChartArea1"].AxisY.TitleFont = new Font("Sans Serif", 10, FontStyle.Bold);
chart.Titles["Title1"].Text = chartTitle;
chart.Titles["Title1"].Font = new Font("Sans Serif", 10, FontStyle.Bold);
chart.Series["Series1"].ChartType = System.Web.UI.DataVisualization.Charting.SeriesChartType.Column;
chart.Series["Series1"]["ShowMarkerLines"] = "True";
chart.DataBind();
Run Code Online (Sandbox Code Playgroud)

c# asp.net charts asp.net-charts

6
推荐指数
1
解决办法
1万
查看次数

如何使用WinRT StreamSockets接收数据包上传确认?

我有一个WinRT应用程序,使用StreamSocket和执行上传DataWriter.它跟踪上传所用的时间,然后计算吞吐量.

我遇到的问题是我的吞吐量比Wireshark显示的要高得多.这是因为我的上传循环在WinRT框架实际将数据发送到网络层之前完成并获取结束时间戳.我发现没有办法从框架接收数据包实际上已经进入网络层的确认.该DataWriter StoreAsync方法只返回您存储的字节数,这是我在存储之前所知道的.

其他框架(如Windows Phone)会在发送数据包后触发回调,并告诉您已上载了多少字节.我没有在WinRT中找到任何等价物,并且必须解决一个记录我在StoreAsync函数中提交了多少字节的循环.

有没有办法从框架中确认何时以及实际发送到网络层的字节数是多少?

更新:我试试@ polkduran的建议,虽然他们帮助减轻了一些数据包丢失,但我仍然在较小的文件上传(100KB)中遇到严重的数据包丢失.对于较大的文件(4MB和10MB),所有数据包都被发送,但结束时间仍然会关闭几秒钟,这会大大降低吞吐量计算(与Wireshark跟踪相比).我的猜测是回调只是减慢了上传速度,而不是提供实际的数据包上传确认.

我仍然在寻找这个问题的解决方案.

编辑:我与微软就此问题创建了一张支持票.他们的官方回应是,在WinRT框架中无法确认数据包是否已实际上传.

c# sockets tcp windows-8 windows-runtime

5
推荐指数
1
解决办法
385
查看次数

如何手动定位ASP.Net Chart Legend?

使用ASP.Net中内置的Chart控件,我试图手动定位Title和Legend,使它们在ChartArea上方水平直接相邻.我已经能够使用以下代码手动定位标题:

chart.Titles["Title1"].Position.Auto = false;
chart.Titles["Title1"].Position.X = 10;
chart.Titles["Title1"].Position.Y = 5;
Run Code Online (Sandbox Code Playgroud)

真的没有什么可以做的.但是,我试图使用以下代码将Legend置于其右侧,并且Legend甚至没有出现:

chart.Legends["Legend1"].Position.Auto = false;
chart.Legends["Legend1"].Position.X = 30;
chart.Legends["Legend1"].Position.Y = 5;
Run Code Online (Sandbox Code Playgroud)

我有什么想法我做错了吗?这似乎应该相对简单.我甚至尝试了各种其他坐标,我无法让Legend出现在任何地方.如果我使用如下所示的内置定位,它会出现,但这种定位不适合我的目的:

chart.Legends["Legend1"].Docking = Docking.Top;
chart.Legends["Legend1"].DockedToChartArea = "ChartArea1";
chart.Legends["Legend1"].IsDockedInsideChartArea = false;
chart.Legends["Legend1"].Alignment = StringAlignment.Far;
Run Code Online (Sandbox Code Playgroud)

c# asp.net charts legend

4
推荐指数
2
解决办法
2万
查看次数

如何在Metro/WinRT中将主机名解析为IP地址?

我正在将WP7应用程序移植到Windows 8 Metro,我遇到的一个(很多)转换障碍是发现基于主机名或DNS名称的IP地址.以下是我之前在WP7中使用的示例:

DnsEndPoint dnsEnd = new DnsEndPoint("www.google.com", 80, AddressFamily.InterNetwork);
DeviceNetworkInformation.ResolveHostNameAsync(dnsEnd, IPLookupCallbackMethod, this);
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了一个解决方案并浏览了Metro API,但我还没有找到任何东西.有没有其他人遇到Metro/WinRT这个问题并找到了解决方案?

c# microsoft-metro windows-8 windows-runtime .net-4.5

2
推荐指数
1
解决办法
3625
查看次数

如何在WinRT中同时允许多个弹出窗口?

如果ShowAsyncMessageDialog对象上调用该命令时,另一个MessageDialog对象已经显示给用户但未被解除(即当另一个对象已经启动时显示弹出窗口),UnauthorizedAccessException则抛出一个.当您有多个线程试图同时提醒用户时,这可能会使事情变得困难.

我当前的(权宜之计)解决方案只是ShowAsync用try/catch块包围调用并吞下异常.这不期望地导致用户错过后续通知.我能想到的另一种方法是手动实现某种弹出队列.这似乎是工作了过多的量,但考虑到其他框架(如Windows电话)没有这个问题,只会显示层出不穷的弹出一个为用户解除他们.

有没有其他方法可以解决这个问题?

c# popup windows-8 windows-runtime winrt-async

2
推荐指数
2
解决办法
3228
查看次数