我创建了Windows Phone 8.1项目,我试图在按钮单击时运行异步方法GetResponse(字符串url)并等待方法完成,但方法永远不会完成.这是我的代码:
private void Button_Click(object sender, RoutedEventArgs
{
Task<List<MyObject>> task = GetResponse<MyObject>("my url");
task.Wait();
var items = task.Result; //break point here
}
public static async Task<List<T>> GetResponse<T>(string url)
{
List<T> items = null;
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
try
{
Stream stream = response.GetResponseStream();
StreamReader strReader = new StreamReader(stream);
string text = strReader.ReadToEnd();
items = JsonConvert.DeserializeObject<List<T>>(text);
}
catch (WebException)
{
throw;
}
return items;
}
Run Code Online (Sandbox Code Playgroud)
它会挂在task.Wait()上.
我将按钮单击方法更改为异步并在异步方法之前使用等待,我得到结果(await GetResponse<string>("url")).有什么问题Task<List<string>> task = …
当无效输入传递给方法或对象即将进入无效状态时,我们通常抛出异常.让我们考虑以下示例
private void SomeMethod(string value)
{
if(value == null)
throw new ArgumentNullException("value");
//Method logic goes here
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我插入了抛出的throw语句ArgumentNullException.我的问题是运行时如何设法抛出ThreadAbortException.显然,throw在所有方法中都不可能使用语句,即使运行时也设法引入ThreadAbortException我们的自定义方法.
我想知道他们是怎么做到的?我很想知道幕后发生了什么,我打开了一个反射器打开Thread.Abort并结束了这个
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern void AbortInternal();//Implemented in CLR
Run Code Online (Sandbox Code Playgroud)
然后我用Google搜索并发现这个ThreadAbortException如何真正起作用.这个链接说运行时通过QueueUserAPC函数发布APC ,这就是他们如何做到这一点.我不知道QueueUserAPC方法我只是试着看一下代码是否可行.以下代码显示了我的尝试.
[DllImport("kernel32.dll")]
static extern uint QueueUserAPC(ApcDelegate pfnAPC, IntPtr hThread, UIntPtr dwData);
delegate void ApcDelegate(UIntPtr dwParam);
Thread t = new Thread(Threadproc);
t.Start();
//wait for thread to start
uint result = QueueUserAPC(APC, new IntPtr(nativeId), (UIntPtr)0);//returns zero(fails)
int error = …Run Code Online (Sandbox Code Playgroud) 我需要将IL转换为c#代码.我有一个集会,我正在阅读这个集会.我从MethodInfo获取MethodBody,方法体有一个方法GetILAsByteArraY(),它返回一个字节数组,现在我想将这个IL转换为C#代码.请帮我解决这个问题.
让我们看一下显示问题的以下片段.
class Program
{
static void Main(string[] args)
{
var task = Start();
Task.Run(() =>
{
Thread.Sleep(500);
Console.WriteLine("Starting GC");
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("GC Done");
});
task.Wait();
Console.Read();
}
private static async Task Start()
{
Console.WriteLine("Start");
Synchronizer sync = new Synchronizer();
var task = sync.SynchronizeAsync();
await task;
GC.KeepAlive(sync);//Keep alive or any method call doesn't help
sync.Dispose();//I need it here, But GC eats it :(
}
}
public class Synchronizer : IDisposable
{
private TaskCompletionSource<object> tcs;
public Synchronizer()
{
tcs = new TaskCompletionSource<object>(this); …Run Code Online (Sandbox Code Playgroud) 假设你有一个像这样的简单类:
class MyClass
{
private readonly int a;
private int b;
public MyClass(int a, int b) { this.a = a; this.b = b; }
public int A { get { return a; } }
public int B { get { return b; } }
}
Run Code Online (Sandbox Code Playgroud)
我可以以多线程方式使用这个类:
MyClass value = null;
Task.Run(() => {
while (true) { value = new MyClass(1, 1); Thread.Sleep(10); }
});
while (true)
{
MyClass result = value;
if (result != null && (result.A != 1 || …Run Code Online (Sandbox Code Playgroud) 我们知道System.Array是一个抽象类,无论DataType[]我们使用什么,运行时都会为我们创建一些具体的实现(虽然模糊不清).
请考虑以下代码段.
int[] someInts = { 1, 2, 3, 4 };
IList<int> collection = someInts;
collection.Clear();
Run Code Online (Sandbox Code Playgroud)
collection.Clear()抛出NotSupportedException,没有什么令人惊讶的.当我查看"StackTrace"时,我惊讶地发现它SZArrayHelper在调用堆栈顶部显示了一些奇怪的"类型" .
堆栈跟踪:
at System.SZArrayHelper.Clear[T]()//Note this.. How???
at TestApplication.Program.Main()
Run Code Online (Sandbox Code Playgroud)
怎么可能呢?我正在调用Clear()方法,int[]但是调用是如何进行的SZArrayHelper.Clear.请注意,这Clear是一个SZArrayHelper定义如下的实例方法.
private void Clear<T>()
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReadOnlyCollection"));
}
Run Code Online (Sandbox Code Playgroud)
谁创建了"SZArrayHelper"的实例,并注意到Clear方法是私有的.我很困惑地看到发生了什么.如果创建了一个"SZArrayHelper"实例并且Clear被调用,那么执行此调用的辅助方法应该出现在"StackTrace"中.但这不是这种情况.
有人可以解释一下幕后发生的事情吗?
注意:
int[]只是和例子,您可以使用任何类型的数组来模拟它.不仅Clear方法Add,Contains等等具有相同的行为..
我尝试使用反射器插件调试,这给出了相同的结果调试器显示直接调用SZArrayHelper.Clear<T>().
只是一个谷歌带我到这个.NET阵列,IList,通用算法,以及STL怎么样?.这有助于理解某种魔法落后但神秘仍然存在.
据我所知,HSL和HSB颜色空间非常相似,两者都使用相同的0-360色轮作为色调,并使用相同的0-1值进行饱和.它们之间的一个区别是在HSB模型中你有亮度,其中0是黑色,1是全强度的颜色,而在HSL中你有亮度/亮度,其中0仍然是黑色但1是白色.
在.NET Color结构采用RGB空间,但GetHue(),GetSaturation()和GetBrightness()功能.
这里的文档令人困惑.用于GetBrightness():
/// <summary>Gets the hue-saturation-brightness (HSB) brightness value for this
/// System.Drawing.Color structure.</summary>
Run Code Online (Sandbox Code Playgroud)
好吧,这很有意义,.Net似乎正在使用HSB ......
/// <returns>The brightness of this System.Drawing.Color. The brightness ranges
/// from 0.0 through 1.0, where 0.0 represents black and 1.0 represents white.
/// </returns>
Run Code Online (Sandbox Code Playgroud)
呃......所以最大值代表白色,而不是最亮的颜色.尽管他们的文档和命名始终指的是亮度,但我很确定返回的值实际上是亮度/亮度,即.Net实际上使用HSL模型而不是HSB.
谁能证实这一点?它是文档中的错误GetBrightness(),错误,还是我以某种方式误解了理论?
你觉得问题很奇怪吗?是的,发生的事也很奇怪.让我解释.
我从C#Arrays中找到了这个Covariance和Contravariance的片段
string[] strings = new string[1];
object[] objects = strings;
objects[0] = new object();
Run Code Online (Sandbox Code Playgroud)
Jon skeet解释说上面的代码会抛出ArrayTypeMismatchException,正如所说的那样.
我做的是我在第3行放置一个断点,使用DebuggerVisualizer我手动设置objects[0] = new object()它不会抛出任何错误,它的工作原理.稍后检查strings[0].GetType()返回System.Object.不仅System.Object可以通过上述过程在string []中设置任何类型.
我不知道这是怎么发生的我在那里提出我的问题作为评论在同一个问题我看到了这个但没有答案.
我很想知道背后发生了什么.有人解释一下.
在重现上述行为后试试这个
int len = strings[0].Length;
Run Code Online (Sandbox Code Playgroud)
如果你把鼠标放在属性长度上是strings[0].Length threw ArgumentException用消息说,Cannot find the method on the object instance但实际上它不会抛出异常和代码运行产生结果len=0
我希望用户点击药水上的图像模糊效果.用户可以在图像上轻击多次,当他点击他点击的图像药水时会变得模糊.
using (var blurfilters = new FilterEffect(source))
{
var blur = new BlurFilter();
blurfilters.Filters = new IFilter[] { blur };
var target = new WriteableBitmap((int)img1.ActualWidth, (int)img1.ActualHeight);
using (var renderer = new WriteableBitmapRenderer(blurfilters, target))
{
await renderer.RenderAsync();
img1.Source = target;
}
}
Run Code Online (Sandbox Code Playgroud) 这是对此答案的后续问题/sf/answers/1440922101/.
我的印象是,Control课程没有实现finailzer,这确实是真的,所以泄露的控件永远泄露,在最终确定期间没有清理.
Hans Passant在评论部分提供了一些提示,说明了它,以及一些关键字ParkingWindow.我用Google搜索了该关键字,找不到任何有用的资源.
最后,我发现了一个名为类ParkingWindow中System.Windows.Forms.Application.ParkingWindow通过反编译器,我无法理解的是什么与做.
看起来像无人看管的窗户将成为这个停车窗口的父级,并在某些时候被摧毁,但不确定.
问题究竟是ParkingWindow什么,它用于什么?
编辑:这与Control的Finalization或cleanup有什么关系?
c# ×9
.net ×5
arrays ×1
async-await ×1
asynchronous ×1
color-theory ×1
covariance ×1
hsb ×1
hsl ×1
memory-model ×1
thread-abort ×1
volatile ×1
winforms ×1
wpf ×1
xaml ×1